Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sta moze da bude kada puca kod malloc-a?

[es] :: C/C++ programiranje :: Sta moze da bude kada puca kod malloc-a?

Strane: 1 2

[ Pregleda: 7019 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?28.04.2003. u 11:29 - pre 255 meseci

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

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?28.04.2003. u 19:02 - pre 255 meseci
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.
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?28.04.2003. u 20:15 - pre 255 meseci
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? :)
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?28.04.2003. u 20:35 - pre 255 meseci
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


 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.dial.tiscali.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?28.04.2003. u 22:10 - pre 255 meseci

Placement new valja uramiti. Više puta.

f
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.bankerinter.net

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?29.04.2003. u 01:29 - pre 255 meseci
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]
 
Odgovor na temu

6544616a006e
Nadej Kilec
Bukulja

Član broj: 10080
Poruke: 44
*.telia.com

Sajt: www.gnu.org


Profil

icon Re: Sta moze da bude kada puca kod malloc-a?30.04.2003. u 02:21 - pre 255 meseci
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.
---
GNU's Not UNIX
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?30.04.2003. u 02:39 - pre 255 meseci
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.


 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.dial.InfoSky.Net

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?30.04.2003. u 14:13 - pre 255 meseci
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.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?30.04.2003. u 19:01 - pre 255 meseci
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.
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.dial.InfoSky.Net

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?02.05.2003. u 14:41 - pre 255 meseci
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...
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?12.05.2003. u 14:52 - pre 255 meseci
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...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: C/C++ programiranje :: Sta moze da bude kada puca kod malloc-a?

Strane: 1 2

[ Pregleda: 7019 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.