Memory leak – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Memory leak – C / C++ – Fórum – Programujte.comMemory leak – C / C++ – Fórum – Programujte.com

 

2. 3. 2008   #1
-
0
-

Dojde pri tomto postupu opravdu ke smazani objektu (*i)?

			entity* eTemp=(*i);

i=entities.erase(i);
delete eTemp;

i je typ std::list<entity*>::iterator, (*i) je tedy potom jeho obsah - objekt entity. Tyto tri radky by mely tu entitu fyzicky vymazat a odstranit ji z listu. Stane se tak? Prosel jsem uz nekolikrat cely kod programu a porad mi tam unika pamet - rychlosti nekolik MB za sekundu. Toto je posledni misto, kde me napada, ze by se mohly dit nekalosti.

EDIT: entities je typ list<entity*>

Diky

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
2. 3. 2008   #2
-
0
-

Už jsem to tu myslím jednou psal. Volat erase/insert v průběhu procházení se nevyplací, protože může dojít k tomu, že některé prvyk budou ukazovat na neplatné místo v paměti(třeba z toho důvodu, že kontejneru se zrovan zachce realokace).

Nahlásit jako SPAM
IP: 85.207.192.–
2. 3. 2008   #3
-
0
-

Ted to alespon funguje. Porad naprosto netusim, jak bych to mel mazat jinak. Vzdyt, i kdybych to nejak znackoval, co se ma smazat, stejne bych to pri tom mazani musel prochazet.

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
2. 3. 2008   #4
-
0
-

Jak už jsem psal,třeba můžeš využít remove_if a mít to v lineárním čase, nebo napsat něco takového:



iterator i = cosi.begin();
for(; i != cosi.end(); )
{
delete *i;
cosi.erase(i);
i = cosi.begin();
}

Nahlásit jako SPAM
IP: 85.207.192.–
sn3d0
Věrný člen
4. 3. 2008   #5
-
0
-

Ja len dodam ze pointer v akomkolvek kontainery sa absolutne nedoporucuje.



typedef list<entity*> entity_list


V kontainery by sa mali uchovavat bud hodnotove typy alebo iteligentne ukazovatele napriklad shared_ptr.



typedef list< shared_ptr<entity> > entity_list;


Taktiez ako bolo spomenute, je vo vseobecnosti vhodne davat prednost algoritmom ako find_if, remove_if, for_each pred klasickymi cyklami.Mozno sa zda ze je to hruza a ze cyklus je jednoduchsi ale opak je pravdou.Su omnoho lebsie udrzovatelne a efektivnejsie ako cykli.

Nahlásit jako SPAM
IP: 213.151.208.–
shutdown -h now
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 43 hostů

Podobná vlákna

Memory leak — založil Duin

.NET Memory leak — založil RomanZ

Windows Service memory leak — založil hlucheucho

Memmory leak — založil Jakub

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý