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

Vysvětlení backtrace – C / C++ – Fórum – Programujte.comVysvětlení backtrace – C / C++ – Fórum – Programujte.com

 

Tassadar
~ Anonymní uživatel
5 příspěvků
24. 5. 2010   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 83.240.110.–
ondra.holub
~ Anonymní uživatel
255 příspěvků
24. 5. 2010   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 89.203.160.–
Tassadar
~ Anonymní uživatel
5 příspěvků
25. 5. 2010   #3
-
0
-

Takže jednoduše kontrola if(object) by měla stačit?

Nahlásit jako SPAM
IP: 83.240.110.–
ondra.holub
~ Anonymní uživatel
255 příspěvků
25. 5. 2010   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 194.138.12.–
KIIV
~ Moderátor
+43
God of flame
25. 5. 2010   #5
-
0
-

To ondra.holub : tusim trida auto_ptr by to mela zvladat :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Tassadar
~ Anonymní uživatel
5 příspěvků
25. 5. 2010   #6
-
0
-

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ý :(

Nahlásit jako SPAM
IP: 83.240.110.–
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, 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

 

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