/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Dynamic allocation memory delete
Fra : Jeppe Sorensen


Dato : 27-05-01 16:05

Hvis man har en structer med 2 pointer i. Først laver man en dynamic
allocation på structer. Bagefter laver man så dynamic allocation på de 2
pointer i structer. Hvis man så sletter structer bliver det memory de 2
pointer pejer på også slettet eller skal de slette før man sletter
structen??

fx
struct ITEM {
   char * name
   char * addr
}

struct ITEM *itemptr = new struct ITEM;

itemptr->name = new char [sizeof(char) * strlen(EN_CHAR_VARIABLE)+1];
itemptr->addr = new char [sizeof(char) * strlen(EN_CHAR_VARIABLE)+1];

delete (itemptr);

eller skal man først kalde



   delete (itemptr->name);
   delete (itemptr->addr);
   også delete(itemptr);

Jeg har nemlig et lille problemt med et program som begynder at sluge
mere og mere ram jo længer det har kørt :)

 
 
Anders Bo Rasmussen (27-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 27-05-01 16:47

On Sun, 27 May 2001 17:05:02 +0200,
Jeppe Sorensen <jeppe@post10.tele.dk> wrote:

>Hvis man har en structer med 2 pointer i. Først laver man en dynamic
>allocation på structer. Bagefter laver man så dynamic allocation på de 2
>pointer i structer. Hvis man så sletter structer bliver det memory de 2
>pointer pejer på også slettet eller skal de slette før man sletter
>structen??
>
>fx
>struct ITEM {
>   char * name
>   char * addr
>}
>
>struct ITEM *itemptr = new struct ITEM;
>
>itemptr->name = new char [sizeof(char) * strlen(EN_CHAR_VARIABLE)+1];
>itemptr->addr = new char [sizeof(char) * strlen(EN_CHAR_VARIABLE)+1];
>
>delete (itemptr);

nej!

>eller skal man først kalde
>
>
>
>   delete (itemptr->name);
>   delete (itemptr->addr);
>   også delete(itemptr);

ja!

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

Igor V. Rafienko (27-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 27-05-01 17:04

* Jeppe Sorensen

> Hvis man har en structer med 2 pointer i. Først laver man en dynamic
> allocation på structer. Bagefter laver man så dynamic allocation på
> de 2 pointer i structer.


I utgangspunktet er dette oppgaven til ctor'ne (du programmerer
tydeligvis i C++).


> Hvis man så sletter structer bliver det memory de 2 pointer pejer på
> også slettet eller skal de slette før man sletter structen??


Dette er noe dtor'en fikser i C++.


> fx
> struct ITEM {
>    char * name
>    char * addr
> }
>
> struct ITEM *itemptr = new struct ITEM;
>
> itemptr->name = new char [sizeof(char) * strlen(EN_CHAR_VARIABLE)+1];
> itemptr->addr = new char [sizeof(char) * strlen(EN_CHAR_VARIABLE)+1];
>
> delete (itemptr);
>
> eller skal man først kalde
>
>    delete (itemptr->name);
>    delete (itemptr->addr);
>    også delete(itemptr);


Ingen av delene:

struct Item
{
char *name, *address;

Item() : name( 0 ), address( 0 ){}

Item( const char *nm, const char *addr ) { // [*]
   name = address = 0;
   name = new char[ strlen( nm ) + 1 ];
   address = new char[ strlen( addr ) + 1];
   strcpy( name, nm );
   strcpy( address, addr );
}

~Item() {
   delete [] name;
   delete [] address;
}
};


void
foo()
{
Item *ip = new Item();

// whatever

delete ip; // Item's dtor will release all resources
}

Forøvrig vil jeg påpeke at i 99.9% av tilfellene er det _feil_ å bruke
char* i C++, da std::string er et _mye_ bedre valg i de fleste
situasjoner (om ikke annet, så fordi den administrerer hukommelsen
selv).





ivr
[*] Nei, dette er ikke helt bombesikkert, men tilstrekkelig for å
illustrere poenget.
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste