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

Memory leaks (ali gde?) !

[es] :: C/C++ programiranje :: Memory leaks (ali gde?) !

Strane: 1 2

[ Pregleda: 6764 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

milas

Član broj: 29337
Poruke: 588
*.ptt.yu.



+3 Profil

icon Memory leaks (ali gde?) !21.08.2004. u 13:34 - pre 238 meseci
Da li mi neko moze reci zasto mi (u output prozoru) debug-era javlja sledece, kada izadjem iz programa:

Code:

Warning: CFile::GetStatus() returns m_attribute without high-order flags.
'Linije.exe': Unloaded 'C:\WINDOWS\system32\msimg32.dll'
Detected memory leaks!
Dumping objects ->
{6413} normal block at 0x00E88248, 44 bytes long.
 Data: <                > 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 
{6412} normal block at 0x00E881E0, 44 bytes long.
 Data: <                > 03 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 
{6411} normal block at 0x00E87E28, 44 bytes long.
 Data: <                > 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 
{6410} normal block at 0x00E87DC0, 44 bytes long.
 Data: <                > 01 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 
{6409} normal block at 0x00E87828, 44 bytes long.
 Data: <                > 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.


Znam da mi je negde ostalo neizbrisano parce memorije, ali sve sto sam napravio sa new u destruktoru sam izbrisao sa delete! Jednostavno, ne znam u cemu je problem?!
 
Odgovor na temu

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

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 14:04 - pre 238 meseci
Izgleda da nije baš sve dealocirano. Pogledaj program još koji put.

Da li iko može išta više da kaže a da ne vidi izvorni kod programa?

f
 
Odgovor na temu

zvrba
The Lord of Chaos

Član broj: 31716
Poruke: 105
*.cmu.carnet.hr



Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 14:19 - pre 238 meseci
Ovo sto ti ispise su adrese, velicine i sadrzaj blokova koje si ostavio neoslobodjene. Pogledaj koji objekt (struktura, klasa, array, itd..) ti je velicine tocno 44 bajta i gdje alociras takve objekte..
 
Odgovor na temu

milas

Član broj: 29337
Poruke: 588
*.ptt.yu.



+3 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 14:20 - pre 238 meseci
O.K. Znam da mi niko ne moze reci u kojoj liniji koda je problem, ali da li mi mozete reci kada se (obicno) desavaju ove greske, tj. u kojim slucajevima?!
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 15:01 - pre 238 meseci
Kad dva puta dodelis isti pokazivac razlicitim podrucjima u memoriji.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.client.comcast.net



+1001 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 16:28 - pre 238 meseci
Evo malog recepta za pomoc:

1) Uzrok - najcesci uzrok je sto si nesto dinamicki alocirao (sa free( ) ili sa malloc())
a nisi dealocirao (sa delete, delete[] ili free()). Sto kaze Marko Paunovic, moguce je
da posle na isti pointer ponovo alociras memoriju, sto je isti problem na kvadrat.

2) Dragocena informacija je velicina objekta koji je ostao neunisten. Na tebi je da
provalis sta je to sto je (u tvom slucaju) dugacko 44 bajta. Ako hoces da pomognes
sebi, pregledaj kod i nadji gde sve alociras memoriju i koji su objekti koje alociras.
Zatim, na zgodnom mestu ubaci debug kod kojim ces da saznas velicine objekata
koje alociras u svom programu. Naprimer:
Code:

#ifdef DA_VIDIMO_GDE_SMRDI
    int nSize;
    nSize = sizeof(CString);
    nSize = sizeof(CFileDialog);
    nSize = sizeof(CRect);
    nSize = sizeof(CPoint);
    ......
#endif


3) Ako radis u Visual Studio-u, kad dobijes te warning-e, probaj da kliknes misem na
neki od njih. Ponekad (ne uvek) VisualStudio ima mogucnost da ti pokaze u kodu na
koji elemenat se warning odnosi.

4) Kad provalis sta je bilo u pitanju, potrudi se da u zgodnom momentu dealociras
to sto si alocirao.

 
Odgovor na temu

milas

Član broj: 29337
Poruke: 588
*.ptt.yu.



+3 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 16:47 - pre 238 meseci
Ne znam da li ovo moze pomoci. Ja sam kreirao neke
objekte (velike 44 bajta) na sledecim
memorijskim adresama (lokacijama):

E8CF68
E8B290
E8B2F8
E8B360
E8BE60
E8CEA0
E87B98
E87C00
E8D568

A on mi na kraju prijavi da sledece memorijske lokacije
nisu oslobodjene (memory leaks):

E8D178
E8D110
E8D0A8
E8D040
E8CFD8

Visual Studio mi ne prikazuje u kojoj liniji koda je problem
(kao sto nekad prikazuje), nego samo ono sto sam napisao.

Da li je mozda problem ako u jednoj petlji uradim ovo

for(int i...
{
Cvorovi *novi = new Cvorovi(x,y);
novi->sled = lista_cvorova; lista_cvorova = novi;
}

gde je lista_cvorova vrh liste cvorova!
 
Odgovor na temu

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

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 17:10 - pre 238 meseci

Citat:

Da li je mozda problem ako u jednoj petlji uradim ovo



Nije problem ako ih posle obrišeš.


f
 
Odgovor na temu

blaza
n/a

Član broj: 961
Poruke: 743
*.vdial.verat.net



+3 Profil

icon Re: Memory leaks (ali gde?) !21.08.2004. u 18:10 - pre 238 meseci
Iz izvestaja debugger-a se moze videti da su prva dva clana (npr. x i y) tvog 44-bajtnog objekta najverovatnije 32 bitni integeri zapisani u little endian formatu. Nisi dealocirao objekte kod kojih je:
-x=0 i y=4
-x=1 i y=4
-x=2 i y=4
-x=3 i y=4
-x=4 i y=4
O_o
 
Odgovor na temu

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

Član broj: 234
Poruke: 2534
*.231.216.81.gus.vf.siwnet.net

Sajt: dejan.lekic.org


+2 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 00:03 - pre 238 meseci
Ako je u pitanju C++, problemi mogu nastati i na neke druge nacine koji su jos tezi (laksi?) za "provaljivanje" evo jednog primera sa ozbiljnim problemom na koji sam skoro naisao:
Code:

int main() 
{
  int* a = new int[338];
  
  class MyClass {
    public:
      MyClass(int* t):
        arr(t)
      {
      } // MyClass() constructor
      ~MyClass()
      {
        delete[] arr;
      } // ~MyClass() destructor
    private:
      int* arr;
  }; // MyClass class

  {
    MyClass b(a);
    MyClass c = b;
  }
  return 0;
}


Primer nema direktne veze, ali ilustruje da prilikom automatske destrukcije objekata moze doci do karambola...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

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

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 00:14 - pre 238 meseci
Citat:
Primer nema direktne veze, ali ilustruje da prilikom automatske destrukcije objekata moze doci do karambola...
Još jedan poen za GC jezike?

f
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net



+6 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 00:25 - pre 238 meseci
Eh, da je mali Perica koristio STL to mu se nikad ne bi desilo:

Code:

class MyClass {
    public:
      MyClass(const std::vector<int>& t):
        arr(t)
      {
      } // MyClass() constructor

    private:
      std::vector<int> arr;
  }; // MyClass class

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net



+6 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 00:38 - pre 238 meseci
E, da. Za slučaj da se ne želi kopiranje niza, umesto vectora ide boost::shared_array.
 
Odgovor na temu

blaza
n/a

Član broj: 961
Poruke: 743
*.vdial.verat.net



+3 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 07:25 - pre 238 meseci
C++-u nedostaje operator pomocu koga bi se mogla odrediti velicina alociranog memorijskog prostora dinamicki alociranog niza.

O_o
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.vdial.verat.net

ICQ: 60630914


+1 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 11:42 - pre 238 meseci
Citat:
filmil: Još jedan poen za GC jezike?


pa nista ga ne sprecava da koristi npr:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/

mozilla i mono se oslanjaju na njega ako se ne varam.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dial.InfoSky.Net



+2789 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 12:29 - pre 238 meseci
Citat:
leka: Primer nema direktne veze, ali ilustruje da prilikom automatske destrukcije objekata moze doci do karambola...


Ja ne znam kako je iko mogao da očekuje da ovakav kod radi kada su napravljene toliko krupne greške.

Prvo, konstruktor ne rezerviše prostor, već dodeljuje već rezervisani prostor svojim atributima.

Drugo, destruktor oslobađa prostor koji nije rezervisao konstruktor.

Treće, kod klase koja ima dinamički rezervisan prostor sa new se koristi podrazumevani operator dodele. Kod takvih klasa se koristi isključivo preklopljeni operator dodele koji oslobađa zauzeti prostor u objektu kome se dodeljuje vrednost, a onda rezerviše nov prostor za njega, i na kraju sve kopira.

Slažem se sa stavom koji uje izneo Dragi Tata da "svega ovoga ne bi bilo da je Pera odmah koristio STL". C++ je isto ''skupljeđubrački" jezik kada se ne koriste new i delete, već samo STL i klase koje su već projektovane i testirane.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milas

Član broj: 29337
Poruke: 588
*.ptt.yu.



+3 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 13:35 - pre 238 meseci
Dobro, ovde se razvila opsirna diskusija koja nije vezana za temu! Naravno da je dobro koristiti __gc ali ovo je unmanaged C++ i to je to! Da li neko zna zasto se u ovoj liniji koda

Code:
while(i < broj) { stari = tek; tek = tek->sled; i++; }


desi sledeci izuzetak:

Code:

First-chance exception at 0x005414bd in Linije.exe: 0xC0000005: Access violation reading location 0xfeeeff16.
Unhandled exception at 0x005414bd in Linije.exe: 0xC0000005: Access violation reading location 0xfeeeff16.
 
Odgovor na temu

blaza
n/a

Član broj: 961
Poruke: 743
*.vdial.verat.net



+3 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 14:51 - pre 238 meseci
U jednom trenutku tek -> sled izazove access violation, zato sto tek pokazuje na neku (0xfeeeff16- offset od sled u objektu) besmislenu lokaciju, koja se ne nalazi unutar memorijskog prostora kome proces moze da pristupa. Verovatno si dosao do kraja jednostruko povezane liste, pa si hteo da ides jos dalje.
Zasto ne koristis debugger?

Pri dodavanju novog clana listi sled inicijalizuj sa NULL.
Tada mozes koristiti sledeci kod bez opasnosti od prekoracenja kraja liste.
Code:
int i= 0;
while(i < broj && (stari = tek)){
    tek = tek -> sled;
    i++;
}

Ako je po izvrsenju koda i < broj dosao si do kraja liste.
O_o
 
Odgovor na temu

milas

Član broj: 29337
Poruke: 588
*.ptt.yu.



+3 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 15:57 - pre 238 meseci
Cini mi se da sam sve uradio kako treba. Po nekada mi prijavi i ovu gresku:

Code:

HEAP[Linije.exe]: Invalid Address specified to RtlValidateHeap( 00E80000, 00E87008 )
Unhandled exception at 0x77f767cd in Linije.exe: User breakpoint.


Kako mogu ovde na forumu da okacim neki fajl?
Prikačeni fajlovi
 
Odgovor na temu

milas

Član broj: 29337
Poruke: 588
*.ptt.yu.



+3 Profil

icon Re: Memory leaks (ali gde?) !22.08.2004. u 15:59 - pre 238 meseci
Okacio sam u prethodnoj poruci fajl koji sadrzi listu, pa ako neko moze da pronadje u cemu je greska bio bih mu vrlo zahvalan!
 
Odgovor na temu

[es] :: C/C++ programiranje :: Memory leaks (ali gde?) !

Strane: 1 2

[ Pregleda: 6764 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

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