Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 31 odgovor
  • 10.804 pregleda

Najnovija ↓

Re: Sta moze da bude kada puca kod malloc-a? 28.04.2003. u 12:29 · pre 286 meseci #21

Upravo sam mislio na pamćenje pointera (T*) u kontejnerskoj klasi. A što se tiče održavanja objekata koji se sadrže u vektoru, čini mi se da tu nema previše izbora: programer mora sam da se brine o njima. To je C++ način. Mada nisam nikada koristio druge alokatore umesto podrazumevanih, možda bi oni mogli da se napišu tako da vode računa o objektima, uz isti interfejs?

f

Re: Sta moze da bude kada puca kod malloc-a? 28.04.2003. u 20:02 · pre 286 meseci #22
Citat:
filmil:

A sad još da te pitam zašto ne koristiš vektore iz STL gde ti se ovakve stvari nikada ne bi rešavale, a povrh toga ne bi morao da se patiš sa promenom veličine?

f


To, brate, to!!! Ja bih zakonom zabranio upotrebu "built-in" nizova. A posebno mi se ne sviđaju heterogeni nizovi, jer prosto prizivaju nevolje (pitajte C# i Java programere).

Nego, nešto drugo meni ovde bode oči. Koliko mi se čini, Peca koristi malloc da alocira objekte. To je loše, jako loše. Obavezno koristi new i delete, jer malloc ne konstruiše objekte, nego samo alocira memoriju za njih. Što je još gore, free ne garantuje pozivanje destruktora, za razliku od delete.
Potpis
IOCC
Re: Sta moze da bude kada puca kod malloc-a? 28.04.2003. u 21:15 · pre 286 meseci #23
Tata, mislim da si u pravu, ali delimicno.

Postupak ubacivanja objekta ide ovako:
Code:

array<covek> a;
a(0).inic ();
a(1).inic ();
a(2).inic ();


operator() vraca &covek, i pritom vodi racuna da alocira dovoljno prostora za novi objekat (ako je potrebno) : allocated+sizeof(T);
Jedina mana je sto inic() mora da ti bude konstruktor, a pravi konstruktor mora da poziva inic().
Isto i za destruktor.

Ovo vazi u slucaju da bas hoces objekte da trpas u niz.

Sa pointerima nema problema:
Code:

array<covek *> a;
a(0) = new covek;
a(1) = new covek;
a(2) = new covek;


No, da se vratimo na ovo prvo.
Kako ti mislis da nateram new da kreira objekat tamo gde ja hocu (u nizu, gde je rezervisana memorija) ?
Ja tu tehniku ne poznajem.
Da li to postoji u STL biblioteci?

P.S. Ja pojma nemam sta sve STL klase mogu, ali ovo moja klasa sama kreira podnizove (mozes da imas koliko hoces dimenzija), zatim mozes da obrises niz (u bilo kojoj dimenziji), mozes rucno da alociras memoriju u nekom nizu, mozes da je dealociras, mozes da vidis duzinu niza, mozes da vidis koliko podnizova ima neki niz (u bilo kojoj dimenziji), mozes da ispitas da li odredjeni podniz postoji, mozes da kopiras neku memoriju/string u nekom nizu, i mozes da pristupis bilo kom bajtu, preko funkcije koja vraca void* na trazeni bajt, pa tako mozes da ubacis/procitas sta hoces na bilo kom mestu.
Sve ovo uz automatsku alokaciju.
Ako uradis recimo :
Code:

niz[5][2][8][4][3][9](5) = 55;

zauzeces svega nekih 70 bajta, jer se alociraju samo podnizovi, samo 'putanja', a ne cela objast.
I mozes u jedan podniz da drzis babe, a u drugi podniz zabe, i nema gazenja :)

Evo primera:
Code:

void example1 ()
{
    papi::array<int> a;

    a(0) = 0;
    a(1) = 1;
    a(2) = 2;
    a(3) = 3;
    a(4) = 4;

    a[1](0) = 10;
    a[1](1) = 11;
    a[1](2) = 12;

    a[1][8](5) = 185;
    
    printf ("[0] = %i\n", a(0) );
    printf ("[1] = %i\n", a(1) );
    printf ("[2] = %i\n", a(2) );
    printf ("[3] = %i\n", a(3) );
    printf ("[3] = %i\n", a(4) );

    printf ("[1][0] = %i\n", a[1](0) );
    printf ("[1][1] = %i\n", a[1](1) );
    printf ("[1][2] = %i\n", a[1](2) );

    printf ("[1][8][5] = %i\n", a[1][8](5) );
    
    printf ("array's root have : %i data cells\n", a.length());
    printf ("array's root have : %i sub-arrays\n", a.sa_length());
    printf ("[1] have : %i data cells\n", a[1].length());
    printf ("[1] have : %i sub-arrays\n", a[1].sa_length());
    printf ("[1][8] have : %i data cells\n", a[1][8].length());
    printf ("[1][8] have : %i sub-arrays\n", a[1][8].sa_length());
}

void example2 ()
{
    papi::array<char> a;
    a.copy ("Countries");
    a[0].copy ("Europe");

    a[0][0].copy ("Serbia and Montenegro");
    
    a[0][1].copy ("France");
    a[0][2].copy ("Germany");
    a[0][3].copy ("Englend");
    a[0][4].copy ("Italy");

    a[1].copy ("Asia");
    a[1][0].copy ("Rusia");
    a[1][1].copy ("China");
    a[1][2].copy ("Japan");
    a[1][3].copy ("India");
    a[1][4].copy ("Pakistan");

    a[2].copy ("Africa");
    a[2][0].copy ("Nigeria");
    a[2][1].copy ("Egypt");
    a[2][2].copy ("Tunis");
    a[2][3].copy ("Maroko");
    a[2][4].copy ("Etiopia");

    a[3].copy ("Australia & Oceania");
    a[3][0].copy ("Australia");
    a[3][1].copy ("New Zeland");

    a[4].copy ("North America");
    a[4][0].copy ("Brasil");
    a[4][1].copy ("Argentina");
    a[4][2].copy ("Columbia");

    a[5].copy ("South America");
    a[5][0].copy ("USA");
    a[5][1].copy ("Canada");
    a[5][2].copy ("Cuba");
    a[5][3].copy ("Puerto Rico");

    a[6].copy ("Grenland");
    a[6][0].copy ("Grenland");
    
    printf ("- %s\n", a.p() );
    int i;
    for (int j=0; j<a.sa_length(); j++)
        if (a.sa_exist(j))
        {
            printf ("--- %s\n", a[j].p() );
            for (i=0; i<a[j].sa_length(); i++)
                if (a[j].sa_exist(i))
                    printf ("------ %s\n", a[j][i].p() );
        }
}

void example3 ()
{
    papi::array<char> a;
    
    a[1](0) = 'a';
    a[1](1) = 'b';
    
    *(int *)a[0].vp(0) = 10;
    *(int *)a[0].vp(4) = 14;

    a[1](2) = 'c';
    a[1](3) = 'd';

    printf ("a[0](0) = %i\n", *(int *)a[0].vp(0) );
    printf ("a[0](1) = %i\n", *(int *)a[0].vp(4) );
    printf ("a[1](0) = %c\n", a[1](0) );
    printf ("a[1](1) = %c\n", a[1](1) );
    printf ("a[1](2) = %c\n", a[1](2) );
    printf ("a[1](3) = %c\n", a[1](3) );
}


Zar je toliko lose sto sam napravio ovo? :)
Re: Sta moze da bude kada puca kod malloc-a? 28.04.2003. u 21:35 · pre 286 meseci #24
Peco, ne kažem ja da je loše to što si napravio, već sam rekao da je loše:

1) Koristiti malloc za objekte.
2) Koristiti built-in nizove.

Pogledaj http://www.glenmccl.com/bett_003.htm

"The first is that new and delete in C++ have more than one function. The new operator allocates storage, just like malloc() in C, but it is also responsible for calling the constructor for any class object that is being allocated. For example, if we have a String class, saying:


String* p = new String("xxx");

will allocate space for a String object, and then call the constructor to initialize the String object to the value "xxx". In a similar way, the delete operator arranges for the destructor to be called for an object, and then the space is deallocated in a manner similar to the C function free().


If we have an array of class objects, as in:


String* p = new String[100];

then a constructor must be called for each array slot, since each is a class object. Typically this processing is handled by a C++ internal library function that iterates over the array.


In a similar way, deallocation of an array of class objects can be done by saying:


delete [] p;
"


Citat:
Kako ti mislis da nateram new da kreira objekat tamo gde ja hocu (u nizu, gde je rezervisana memorija) ?


Koristiš "placement new" http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

Potpis
IOCC
Re: Sta moze da bude kada puca kod malloc-a? 29.04.2003. u 02:29 · pre 286 meseci #26
Placement new mozes odmah da koristis, ovako:
Code:

array<covek> a;
new (&a(0)) covek("Tata");
a(0).cao();


Ne vidim ni kako bi to moglo drugacije da se implementira.
Ako napravim funkciju koja to radi - kako onda da znam parametre koje trebam konstruktoru da prosledim? :)
Po meni to nije uopste moguce!

Drugo, sta podrazumevas pod built-in nizovima?
Ne znam na sta mislis pod tim pojmom?

[Ovu poruku je menjao Predrag Damnjanovic dana 29.04.2003. u 01:54 GMT]
Re: Sta moze da bude kada puca kod malloc-a? 30.04.2003. u 03:21 · pre 286 meseci #27
Ovo je debelo standardna početnička C++ priča... koja se ukratko završava na: C++ programer si? - Koristiš new/delete. C programer si? - Koristiš malloc/free (ili nešto deseto, ili pišeš sopstvene funkcije za alociranje/dealociranje). Modula3 programer si? - Ne razmišljaš previše. Java programer si? - (Skoro) isto kao sa Modulom.
Potpis
---
GNU's Not UNIX
Re: Sta moze da bude kada puca kod malloc-a? 30.04.2003. u 03:39 · pre 286 meseci #28
Citat:
Predrag Damnjanovic:

Drugo, sta podrazumevas pod built-in nizovima?
Ne znam na sta mislis pod tim pojmom?


Mislim na nizove koji se alociraju sa new ili nedajbože malloc. I najzeleniji C++ početnik treba da nauči da koristi std::vector i std::string.

Potpis
IOCC
Re: Sta moze da bude kada puca kod malloc-a? 30.04.2003. u 15:13 · pre 286 meseci #29
tata, kada objavim klasu shvatices prednosti ove, i shvatices zasto ne koristim vector :)

6544616a006e : vec sam rekao zasto ne koristim new, ali evo opet cu: sa new ne mogu da prosirujem niz, ne postoji renew, kao sto postoji realloc.

Inace, new koristim za kreiranje objekata u nizu:
Code:

    array<man> a;
    new (&a(0)) man("Peca", 83);
    new (&a(1)) man("Mike", 81);
    new (&a(2)) man("Billy", 75);
    printf ("1. man : name : %s \t age : %i\n", a(0).name, a(0).age );
    printf ("2. man : name : %s \t age : %i\n", a(1).name, a(1).age );
    printf ("3. man : name : %s \t age : %i\n", a(2).name, a(2).age );
    a(0).~man();
    a(1).~man();
    a(2).~man();


malloc sluzi samo za rezervisanje memorije.
Re: Sta moze da bude kada puca kod malloc-a? 30.04.2003. u 20:01 · pre 286 meseci #30
Peco, nemoj pogrešno da me shvatiš. Sasvim je OK koristiti klasu kao što je tvoja umesto built-in nizova, pod uslovom da je dobro istestiraš. Kao što rekoh, ja sam protivnik direktnog korišćenja built-in nizova u kodu, a takve wrapper klase su daleko bolje rešenje.
Potpis
IOCC
Re: Sta moze da bude kada puca kod malloc-a? 02.05.2003. u 15:41 · pre 286 meseci #31
Klasu maximalno testiram, i kroz primere (ima ih 7) i kroz moja 2 komercijalna projekta, gde je bas forsiram, i plus proveravam uz pomoc memory check programa, kao sto je valgrind, nema ni memory leak-a, ni prelivanja bafera, niti bilo cega drugog.

Na kraju, ja zaista nemam nameru niti da reklamiram klasu, niti teram nekog da je koristi, za sebe sam je pravio...
Bice unutar moje biblioteke, kao opensource, za par nedelja...
Re: Sta moze da bude kada puca kod malloc-a? 12.05.2003. u 15:52 · pre 285 meseci #32
Ja se nikad necu navici na std:: iako se to preporucuje svim C++ programerima... Isto vazi i za sablone. Celog zivota cu sam pisati kod koji ili koristi new/delete ili (m|c|re)alloc(a)/free . Jeste da je sa std:: brze (razvoj je brzi), ali sa ovim drugim nacinom mi je kod mnogo kompaktniji i brzi (uvek!). Nazalost, od onih ljudi sam koji bi zrtvovali vreme za malo brzine uvek...
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme