|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
Guest
|
Posted: Thu Feb 09, 2006 3:17 pm Post subject: |
|
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
|
Posted: Thu Feb 09, 2006 6:48 pm Post subject: |
|
Anonymous wrote: |
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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
|
|
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
|