Zdravím,
nedávno mi jeden program začal padat na dekonstruktoru jedné třídy: http://pastebin.com/HhTfM7kp . Ještě sem se s níčím takovým nesetkal, a tak nevím, co s tím.
Mám pár nápadů co by to mohlo způsobovat, ale víceméně sou to jen tipy:
1. Nějáký std::list<Aura*> není smazaný před voláním dekonstruktoru(podle par poslednich radku z backtrace)
2. Dekonstruktor je volan "spatny" - viz ~Totem(), který je volaný před dekonstruktorem mateřské třídy Creature, možná to není totem ale nějáká jiná pod-třída.
3. Creature už byla smazaná v jiném vlákně(?)
Díky za všechny rady.
Fórum › C / C++
Vysvětlení backtrace
Jestli to padá v destruktoru, tak by to mohlo být tím, že se dělá delete na již uvolněnou instanci té třídy (nebo jejího potomka), ke které patří destruktor.
Ne, to obvykle nestačí. delete x nenastaví x na 0. A stejně by se tím neošetřil případ typu:
int* p1 = new int(10);
int* p2 = p1;
// ...
delete p1;
p1 = 0;
// ...
// A tady zkusím použít *p2, což vede k chybě, protože p2 odkazuje na uvolněnou paměť.
*p2 = 12345;
V programu je nutné si hlídat to, aby byl vždy jenom jeden vlastník dynamicky alokovaných dat. Tento vlastník se může změnit, ale nemůžou být zároveň dva vlastníci. Tento vlastník je pak jediný, kdo může data uvolnit.
Pokud je řešení vlastnictví obtížné, lze využít i nějakých "chytrých" ukazatelů s reference countingem, které si počítají, kolikrát je daný ukazatel odkazován. V případě, že už ten ukazatel nikdo nereferencuje, paměť je uvolněna. Není to všelék (např. pro cyklické odkazy to dělá problémy), ale je to poměrně snadno a efektivně použitelná věc.
Díky za rady, prostě jsem před to delete dal kontrolu if(IsInWorld()) která musí vyhodit true pokud objekt ještě existuje. Bohužel, není to dobré řešení, lepší by bylo najít jak je možné, že se ten delete volá, ale v tom programu ze kterého backtrace pochází, je to docela nesnadné, protože je open-source a je obrovský :(
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žení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 67 hostů
Podobná vlákna
Vysvětlení pojmů — založil Venca
Vysvětlení cyklu for — založil Thalorn
Vysvetleni syntaxe — založil radecek88
Vysvětlení kodu — založil Mutagen
Vysvětlení dědění — založil felix
Moderátoři diskuze