dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

C++ Self delete hierarhijā..

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: Sat Jul 11, 2009 1:46 am    Post subject: C++ Self delete hierarhijā..

Vairākas reizes esmu nonācis līdz šai problēmai, un netā neko par šo gadījumu neesmu atradis.
Tātad, ir parent-child hierarhija... Tiek saņemta ziņa par parent`a dzēšanu. Ziņa tiek saņemta caur child`u, tālāk izdzēšot parentu, tā destruktorā tiek izdzēsti child`i, un instrukciju pointeris paliek nekurienē.. laikam labāk parādīt ar piemēru..

Vienkāršoti:

Code:

class C_Base
class C_Inherited_From_Base : public C_Base
class C_Inherited_Parent : public C_Base (instance uzstaadiita kaa parent of C_Inherited_From_Base)

Viss saakas, kad izsaucam C_Inherited_From_Base::Dummy()...

void C_Inherited_From_Base::Dummy()
{
   C_Base::Dummy();
   
   // sheit rodas naturaals crash, jo shii instance vairs neeksistee
   kods...
}

void C_Base::Dummy()
{
   if (m_Parent)
      m_Parent->Dummy(); // izsauc zemaak esosho C_Inherited_Parent::Dummy()
}

void C_Inherited_Parent::Dummy()
{
   if (...)
      delete this; // destruktoraa izdzeesh visus beernus (taatad C_Inherited_From_Base instanci)
}



Jebkurā gadījumā programma atgriežas iekš dzēstās instances un sākas joki... skaidrs, ka tādai sistuācijia nav jābūt.

Varbūt apskaidrojiet kā pareizi veido tāda veida sistēmas.

Un vēl, kāpēc tas joks dažreiz tiek ignorēts release modē, bet ne debug..
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Sat Jul 11, 2009 2:38 am    Post subject:

Nevar to ziņu vienkārši saglabāt un izpildīt tad, kad child'i neko nedara?
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
Tenjou



Joined: 22 Nov 2005
Posts: 275

PostPosted: Sat Jul 11, 2009 12:04 pm    Post subject:

1) Pointeri vajag pielidzinaat NULL, pec dzeeshanas, jo Tu izdzees noradito atminjas apgabalu izmantoto, bet pointeris veel norada uz sho atminjas apgabalu. Debug versijaa parasti to kompileris Tavaa vietaa paruupeejas.
2) Labak ir lietot virtualas funkcijas taa vietaa.
Code:
void C_Base::Dummy()
{
   if (m_Parent)
      m_Parent->Dummy(); // izsauc zemaak esosho C_Inherited_Parent::Dummy()
}


Edit: Tava gadijuma mazliet neskaidri, manupraat pareiza prakse ir dzest objektus arpus vinja pasha un tad m_Parent atbrivot un pielidzinat NULL. Jo, kad tu atbrivo no iekshas, m_Parent nemaz nezina, kad tika jau atbriivots.
Back to top
View user's profile
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: Sat Jul 11, 2009 12:48 pm    Post subject:

snake5:
nu laikam jau tā būs jādara, neizskatās, ka citādi sanāks.

Tenjou:
Kādu pointeri tu domā pielīzināt NULL? this? Šeit tā nav problēma, programmai jebkurā gadījumā ir jāatgriežas iekš C_Inherited_From_Base::Dummy(), lai atgrieztos uz tās izsaukuma vietu (call stack).
Par to pareizo praksi viedokļi parasti dalās, bet tas tākā būtu noskaidrots, ka objektam izdarot pašnāvību (delete this), viņa destruktors tiek izsaukts un atmiņa atbrīvota (ja instance izveidota ar "new", bet citādi gan tas izraisa undefined behavior), bet tiesa gan, šeit ir pavisam cita lieta..
Aizmirsu piebilst, ka tās ir virtuālās funkcijas, es šeit nepierakstīju..

Šķiet, ka būs jādara tas, ko teica skane5.. bet tomēr, ja te vēl kāds zinošs varētiu pakomentēt, būtu labi.
Back to top
View user's profile Visit poster's website
Arrovs



Joined: 10 Mar 2007
Posts: 96
Location: Saldus

PostPosted: Wed Jul 15, 2009 4:24 pm    Post subject:

kāpēc pirms iešanas uz bērniem nepārbaudi vai tie pastāv? Un ja nav ignorē pāreju.
Un kāpēc dzēšot this dzēšās bērni? Būtu jādzēšās vienam objektam, kam ir tobrīd uzlikts this. Bet es jau neesu specs - droši vien kļūdos.
_________________
Arrovs komanda
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group