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

Memory Leak (malloc & new)

[es] :: C/C++ programiranje :: Memory Leak (malloc & new)

[ Pregleda: 2672 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.vdial.verat.net.



+9 Profil

icon Memory Leak (malloc & new)18.05.2005. u 07:22 - pre 195 meseci
Imam sledece pitanje: Ako imam sledecu f-ju:

Code:

string nesto(int nestodrugo)
{
  char *newcon;
  int size;
  /*ovde se nesto racuna... i dobije se vrednost promenljive size...*/
  newcon = new char[size];
  return(newcon);
}


1. E sada, ovde ima curenja memorije, zar ne? Ostace deo memorije bez newcon pokazivaca. Koji je elegantan nacin da ja dealociram memoriju koju sam dodelio newcon pokazivacu, uzevsi u obzir da on mora dinamicki da dobija velicinu... ne znam koliko je size unapred.

2. Jos jedno pitanje, ispravite me ako nisam razumeo, kada se u lokalnoj funkciji dinamicki dodeli memorija nekom pokazivacu sa operatorom new, ona se ne unistava po izlasku iz funkcije. E sada... (nisam bas razumeo Bjarne-a), da li ce se unistiti ako je dodelim sa malloc, a ne sa new operatorom?
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.in-addr.btopenworld.com.



Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 10:22 - pre 195 meseci
Za svaki new moras da imas odgovarajuci delete, za svaki malloc odgovarajuci free... prosto zar ne...

yooyo
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.verat.net.



+9 Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 10:38 - pre 195 meseci
Hm... ali zar ne vidis? Moram da vratim newcon pa tek onda da ga obrisem. E to je zackoljica... ako bi se tako mogla nazvati.
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 12:36 - pre 195 meseci
Citat:
goranche_:
2. Jos jedno pitanje, ispravite me ako nisam razumeo, kada se u lokalnoj funkciji dinamicki dodeli memorija nekom pokazivacu sa operatorom new, ona se ne unistava po izlasku iz funkcije. E sada... (nisam bas razumeo Bjarne-a), da li ce se unistiti ako je dodelim sa malloc, a ne sa new operatorom?

Naravno da nece,posto i operator new koristi malloc.
Sto se tice prvog pitanja najbolje bi bilo da ne konbinujes char* i string,vec umjesto
Code:

char *newcon;
//stavi
string newcon;

...jer onda ne moras da razmisljas da li ce doci do curenja memorije posto se za to brine klasa string.

 
Odgovor na temu

skijash
Nikola Petrović
Software engineer, Vast.com
BG

Član broj: 8511
Poruke: 344
*.97.EUnet.yu.

Sajt: www.mafiamotorsport.org


+2 Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 13:13 - pre 195 meseci
Da bi koristio tu vrednost koju vraca funkcija dodelis je nekoj promenljivoj, i onda da tu promenljivu izbrises...
Code:

x *prom = funkcija();
delete prom;

x je naravno tip pokazivaca koji vraca f-ja.
A ako ti je potreban samo string, nema razloga da koristis char*.
...:::|skijash|:::...
www.beoprint.rs ::: www.mafiamotorsport.org
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 13:26 - pre 195 meseci
Pokusaj pisanja koda iz Thunderbirda:

Code:

string nesto(int nestodrugo)
{
char *newcon;
int size;
...
newcon = new char[size];
...
string ret(newcon);
delete[] newcon;
return ret;
}

Mozda moze da se koristi i neki auto_ptr, smart_ptr, nisam s njima radio ali to bi im bila svrha.
Mozda moze i da se zauzme prostor u std::string, pa da se popuni direkto bez char*.
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 13:41 - pre 195 meseci
Nije mi jasno zasto ne smisle nesto tipa garbage collector-a iz Jave.

Gledao sam, cak i QT sam brine o dealokaciji.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.in-addr.btopenworld.com.



+4 Profil

icon Re: Memory Leak (malloc & new)18.05.2005. u 16:42 - pre 195 meseci
Citat:
Naravno da nece,posto i operator new koristi malloc.

Ovo ne treba uzimati doslovce, jer standard kazhe da malloc() koristi heap, a operator new free store. Implementacije u kompajleru mogu da se razlikuju, a i moguce je da imash preklopljeni operator new koji ce alocirati memoriju na sasvim drugachiji nachin.

Anyway, to i nije tema...

Ova solucija :
Code:

newcon = new char[size];
string ret(newcon);
delete[] newcon;
return ret;


ima problem u tome shto u jednom trenutku imash dve kopije istog stringa u memoriji, shto nije strashno ako je string relativno mali. Ali ako taj fajl koji si uchitao (ili tome slichno) tezhi megabajte, mozhe biti problema.

Pravo reshenje bi bilo, recimo, primena RAII idioma (imash string, koji je tip resursa u tvojoj aplikaciji, koristish taj jedan buffer na vishe mesta i imash problema sa uparivanjem allocate/release poziva... perfect case for RAII)
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.vdial.verat.net.



+9 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 00:01 - pre 195 meseci
A da li je moguce newcon pointer dodeliti nekom globalnom pointeru i kasnije van funkcije obrisati taj globalni pointer(odnosno ono na sta on ukazuje)? Mozda bi to bila jedna od mogucnosti...

Buffy je pomenuo da koristim string... meni treba iskljucivo char*, posto samo to moze da bude argument funkcije file_handle.read(char*,int)
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 00:43 - pre 195 meseci
Citat:
A da li je moguce newcon pointer dodeliti nekom globalnom pointeru i kasnije van funkcije obrisati taj globalni pointer(odnosno ono na sta on ukazuje)? Mozda bi to bila jedna od mogucnosti...

Naravno da je moguce, pitanje je da li hocesh brzo ili elegantno i "safe" reshenje.
Uvek se mozhe desiti da usled preuranjenog izlaska iz programa/funkcije ne oslobodish taj globalni string, shto opet ne valja.
Ako ti je cilj C++ pristup, opet kazhem :), pogledaj RAII idom, koji ce te (pravilno implementiran) osloboditi muka oko razmishljanja da li je neshto ostalo da "visi" (string, file handle, neki drugi resurs) ili ne.
 
Odgovor na temu

vladab
Vladimir Bašanović
Beograd

Član broj: 9512
Poruke: 498
*.unilib.bg.ac.yu.



Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 12:35 - pre 195 meseci
Citat:
goranche_: A da li je moguce newcon pointer dodeliti nekom globalnom pointeru i kasnije van funkcije obrisati taj globalni pointer(odnosno ono na sta on ukazuje)? Mozda bi to bila jedna od mogucnosti...

Moguce je i tako i treba, ako vec ne koristis string.

Citat:
goranche_:
Buffy je pomenuo da koristim string... meni treba iskljucivo char*, posto samo to moze da bude argument funkcije file_handle.read(char*,int)

Uvek mozes da koristis cast da bi prebacio nesto iz string u char*. Stavis mi kao argument static_cast<char*>(ime_string_promenljive), tako da string uopste i nije problem.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.neobee.net.



+9 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 12:46 - pre 195 meseci
Evo te "diskutabilne" funkcije (mislim da je NastyBoy video)
Code:

string loadfile(char *filename)
{
    long size; string nuke; char *newcon;
    ifstream file(filename,ios::in|ios::binary);
    if(file.is_open()){
    file.seekg(ios::beg,ios::end);
    size = file.tellg();
    file.seekg(ios::beg);
    newcon = new char[size];
    file.read(newcon,size);
    nuke = newcon;
    delete[]newcon;
    newcon = NULL;
    }
    file.close();
    return(nuke);
}

Medjutim, kao sto je NastyBoy rekao, dve kopije fajla u isto vreme... Naravno, ovde newcon nije moralo da bude pokazivac, ali je pozeljno, kako ne bih vrsio njenu deklaraciju ispod sracunate size promenljive.

Citat:
vladab: Uvek mozes da koristis cast da bi prebacio nesto iz string u char*. Stavis mi kao argument static_cast<char*>(ime_string_promenljive), tako da string uopste i nije problem.


Ne mozes da kastujes tako string, koliko ja znam. String klasa ima metodu c_str() koja vraca char*. Btw, ovde gde je f-ja file.read(newcon, size); prvi argument mora da bude (ispravite me ako gresim) char*, zato sto se u njega pise...
 
Odgovor na temu

vladab
Vladimir Bašanović
Beograd

Član broj: 9512
Poruke: 498
194.106.164.*



Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 15:54 - pre 195 meseci
Citat:
goranche_:
Ne mozes da kastujes tako string, koliko ja znam. String klasa ima metodu c_str() koja vraca char*. Btw, ovde gde je f-ja file.read(newcon, size); prvi argument mora da bude (ispravite me ako gresim) char*, zato sto se u njega pise...

Da, u pravu si za castovanje stringa. Moja greska. Malo sam se zaneo. :O)
Mislim da treba da bude char*.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.neobee.net.



+9 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 16:36 - pre 195 meseci
Recimo da sam resio sta cu sa onim newcon pokazivacem koji ostaje da visi. Ipak sam vezao ono na sta pokazuje za jedan globalni char* pokazivac i nakon izlaska iz f-je sam ga obrisao.
Mogao sam mozda da napisem i funkcijski objekat... ali previse komplikacija za onoliku funkciju :)

Jos nesto... generalno vezano za temu, da li ima razlike ako za objekat prvo alociram memoriju sa malloc i posle eksplicitno pozovem konstruktor ili ako memoriju alociram sa new. Da li new operator radi jos nesto sem alokacije i pozivanja konstruktora?
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.in-addr.btopenworld.com.



+4 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 16:57 - pre 195 meseci
Citat:
Jos nesto... generalno vezano za temu, da li ima razlike ako za objekat prvo alociram memoriju sa malloc i posle eksplicitno pozovem konstruktor ili ako memoriju alociram sa new. Da li new operator radi jos nesto sem alokacije i pozivanja konstruktora?


Kako to mislish da eksplicitno pozovesh konstruktor?

Nadam se da si mislio na "placement new" operator - alocirash memoriju i kreirash objekat na toj lokaciji.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.neobee.net.



+9 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 20:40 - pre 195 meseci
Ne, nisam mislio na placement new, vec na sledece:

Code:

class someclass
{
  public:
    someclass(){
      n = 1;
      x = "Mag";
    }
     int n;
     string x;
};


Code:

someclass *p;
p = (someclass*)malloc(sizeof(someclass));
p->n = 1;
p->x = "NestoDrugo"; //ovo nece da valja...


Medjutim... ovo ce da funkcionise samo ako su clanovi klase prosti tipovi, dok ce p->x = "NestoDrugo" da prijavi gresku zato sto je string zapravo klasa za koju nije alocirana memorija. A sta sam mislio pod eksplicitnim zvanjem konstruktora...:

Code:

p->someclass(); //Zeznuo sam se, ovo ipak nece da funkcionise
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 21:05 - pre 195 meseci
Citat:
someclass *p;
p = (someclass*)malloc(sizeof(someclass));
p->n = 1;


1. Ne znam shta ustvari pokushavash sve vreme, ali ovo NIKAD vishe nemoj :)
Ovo samo SLUCHAJNO radi, jer ti ustvari gadjash memoriju preko forsiranog tipa pointera. Objekat koji sadrzhi ne-trivijalne tipove mora da prodje kroz konstruktor (zaboravljash da se u tom konstruktoru PRVO pozivaju konstruktori svih klasa koje tvoja klasa sadrzhi, u ovom sluchaju konstruktor std:string klase).

2. Eksplicitno pozivanje konstruktora nije moguce u C++u (za razliku od destruktora, kog mozhesh eksplicitno pozvati)

 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.neobee.net.



+9 Profil

icon Re: Memory Leak (malloc & new)19.05.2005. u 21:10 - pre 195 meseci
Da, video sam da je to besmisleno.
A i to slucajno pogadjanje uveliko zavisi od redosleda deklarisanja podataka(trivijalnih ili klasa).
Zaista.. je bila glupost :)
 
Odgovor na temu

[es] :: C/C++ programiranje :: Memory Leak (malloc & new)

[ Pregleda: 2672 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

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