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

C++: delete, neizsaucot destruktoru.
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Wed Feb 08, 2006 6:10 pm    Post subject: C++: delete, neizsaucot destruktoru.

Gribēju paprasīt, vai ir iespējams rezervēt atmiņu, izmantojot new( tiek izsaukts konstruktors), bet, atbrīvot atmiņu ar delete, BEZ destruktora izsaukšanas.

Un otrādi, new BEZ konstruktora izsaukšanas, delete ar destruktora izsaukšanu.

P.S. Es zinu, ka tā darīt nav pareizi un ka tāda fīča norāda par programmas struktūras kļūdu, bet vienkārši interesanti, vai tā ir iespējams izdarīt, nesagandējot pašu klases kodu.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Feb 08, 2006 6:15 pm    Post subject:

Man liekas, to var panākt aptuveni šādi (vienīgais, ka "konstruktors" pašam jāizsauc):
Code:
  class X {...};
  ...
  X* x = (X*)malloc(sizeof(X));
  x->Initialize(...); // tipa izsaucam "konstruktoru"
  ...
  free(x);

Neesmu gan pārliecināts, tb nepārbaudīju vai tas darbojās. Līdzīgi, protams, var tavu otrādo variantu realizēt. Taču tiešām nesaprotu, kam tev tas vajadzīgs. Tad jau labāk ņemt tīru C un darboties struct'iem, nevis klasēm :)

Vēl iedomājos - ja destruktors ir virtuāls, tad nomantot klasi, un uztaistīt tai jaunu, tukšu destruktoru. Un piedāvāt lietot tikai šo klasi, ne iepriekšējo.


Last edited by bubu on Wed Feb 08, 2006 6:22 pm; edited 1 time in total
Back to top
View user's profile Send e-mail
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Wed Feb 08, 2006 6:21 pm    Post subject:

bubu wrote:
Man liekas, to var panākt aptuveni šādi (vienīgais, ka "konstruktors" pašam jāizsauc):
Code:
  class X {...};
  ...
  X* x = (X*)malloc(sizeof(X));
  x->Initialize(...); // tipa izsaucam "konstruktoru"
  ...
  free(x);

Neesmu gan pārliecināts, tb nepārbaudīju vai tas darbojās. Līdzīgi, protams, var tavu otrādo variantu realizēt. Taču tiešām nesaprotu, kam tev tas vajadzīgs. Tad jau labāk ņemt tīru C un darboties struct'iem, nevis klasēm :)


Bet, ja X ir templates typename?
Un tad jau nekādas garantijas, ka visiem Xsiem būs Initialize( ).
Un ārpus klases interfeisa konstruktoru izsaukt nevar. :)
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Wed Feb 08, 2006 7:26 pm    Post subject:

void main()
{
{
cDummy * d;

d = ( cDummy * )malloc( sizeof( cDummy ) );

*d = *( new cDummy );

free( d );
}

}
Heh. :)
According to mans debugs, CTORs izsaucas vienu reizi, bet nekādu DTORu, izejot no scope.

EDIT: būs atmiņas leaks.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Feb 08, 2006 7:38 pm    Post subject:

Tev tiešām tiešām vajag kautko tik dīvainu, kā atbrīvot atmiņu neizsaucot destruktoru?
Back to top
View user's profile Send e-mail
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Wed Feb 08, 2006 7:42 pm    Post subject:

bubu wrote:
Tev tiešām tiešām vajag kautko tik dīvainu, kā atbrīvot atmiņu neizsaucot destruktoru?

Īstenībā nē.
Just playing around.
Bet vienu interesantu optimizāciju uz šitā bāzes varētu uztaisīt, ja sanāktu.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
Guest






PostPosted: Thu Feb 09, 2006 3:17 pm    Post subject:

BHC wrote:
optimizāciju

Neizpildot destruktoru vietā, kur bez viņa vaiztikt (objekts nav rezervējis atmiņu saviem mainīgajiem), netiks iegūts nekāds optimizējošs efekts, jo D taču neko nedara!
Back to top
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Thu Feb 09, 2006 6:48 pm    Post subject:

Anonymous wrote:
BHC wrote:
optimizāciju

Neizpildot destruktoru vietā, kur bez viņa vaiztikt (objekts nav rezervējis atmiņu saviem mainīgajiem), netiks iegūts nekāds optimizējošs efekts, jo D taču neko nedara!


Ok, viens ne pārāk izteiksmīgs piemērs:
Pieņemsim, ka man ir dinamiskā masīva klase ( a la savs specifisks std::vector ).

Palielinot/pamazinot masīvu, rezervēju pa jaunu atmiņu:

newData * T = new [ newSize ];

Iekopēju vecos datos jaunajā masīvā:

for( u16 n = 0; n < MIN( newSize, mUsedElem ); n++ )
newData[ n ] = mData[ n ];

Izdzēšu veco masīvu:

delete [] mData;

Saglabāju jaunā masīva adresi:

mData = newData;

Viss ir labi un jauki, bet pie "delete [] mData" mēs izsaucam T destruktoru, bet ja T satur rezervētu atmiņu, tā tiks atbrīvota destruktorā, bet newData masīva elementi norādīs uz to atbrīvoto atmiņu.

Ja varētu atbrīvot mData, neizsaucot destruktoru, tādas problēmas nebūtu.

Iespējamie risinājumi:

1. Protams, var pirms mData izdzēšanas vienkārši mData atmiņu memsetot uz nullēm, tad izsauktais destruktors(šķiet) nekādu posto nenodarīs.

2. Vai arī overloadot T::operator=, kur paņemisim argumenta pointeri saglabāsim un argumentam pointerus noliksim uz nullu.

Un, erm, optimizācija būtu kaut vai tur, ka varētu atmiņu vienkārši pārkopēt ar memcpy nevis pa vienam elementam.

Dotajā gadījumā ir divi varianti tātad:
1. memcpy, memsets uz 0, izdzēšam
2. overloadēts operators= un kopēšana pa vienam, izdzēšanam

P.S. Es netaisu savu std::vector klasi, pasarg Dies, viņš priekš manis ir pietiekoši labs.
P.S.S. Es ļoti iespējams dzenu fuflu(nē, es pavisam noteikti dzenu fuflu).

Labojiet.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Thu Feb 09, 2006 7:57 pm    Post subject:

Kapec tu ta sarezhgjii dziivi?Parasti programmeetaaji izmanto realloc un viss.Nekadu problemu.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Thu Feb 09, 2006 8:17 pm    Post subject:

elvman wrote:
Kapec tu ta sarezhgjii dziivi?Parasti programmeetaaji izmanto realloc un viss.Nekadu problemu.

Pavisam vienkārša atbilde - malloc/reallocs neizsauc konstruktoru.

Un, nē, es neesmu parasts programmētājs in that case.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Thu Feb 09, 2006 8:56 pm    Post subject:

A vienkaarshi uztaisiit klasee vienu papildus "bool destroy;" un attieciigi tas buutu true peec defaulta, bet ja ir veelme izdariit taadu mahinaaciju, kaa dots paraugaa, tad uzseto uz false, un destruktors riikojas atbilstoshi? Tad gan jaasagatavo katra klase, kuru grib tureet taadaa "std::vektoraa".

Vai arii izmantot smart pointerus vai garbage collectionu?
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Thu Feb 09, 2006 9:11 pm    Post subject:

elvman wrote:
Parasti programmeetaaji izmanto realloc un viss. Nekadu problemu.

Normāli programētāji (laikam sanāk, ka tie ir neparastie programmētāji) saprot, ka realloc un c++ ir divas dažādas lietas. Vēl jo vairāk - realloc negarantē pointera adreses nemainīšanos. Un tad problēmas rodās.
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Thu Feb 09, 2006 11:19 pm    Post subject:

Nu vechi.Kur ir problema?
Kods:
tips* pPointer=new tips();

Un ja vajag mainiit pPointer lielumu:
pPointer=(tips*)realloc(pPointer,jaunais_izmers);

Un visa lielaa magjija.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Thu Feb 09, 2006 11:21 pm    Post subject:

Un vispar - jautajums bija:

Quote:
Un otrādi, new BEZ konstruktora izsaukšanas, delete ar destruktora izsaukšanu


Tieshi to arii malloc dara.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Thu Feb 09, 2006 11:25 pm    Post subject:

elvman wrote:
Un vispar - jautajums bija:

Quote:
Un otrādi, new BEZ konstruktora izsaukšanas, delete ar destruktora izsaukšanu


Tieshi to arii malloc dara.


New/delete un malloc/free nav ietiecams jaukt kopā.
Var gadīties "dīvaini" gļuki.

Respektīvi, ja aizņēmi atmiņu ar new, tad atbrīvo viņu ar delete.

AFAIK.

Vēl no savas puses varu pieminēt, ka malloc/free/realloc ir C opera.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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