 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Moll Guest
|
Posted: Mon Dec 15, 2003 11:50 am Post subject: Wann wird der this Zeiger "genutzt"? |
|
|
Hallo NG
Ich bin heute über eine Stelle in meinem Code gestolpert, an der innerhalb
einer Memberfunktion einer Klasse der letzte smart pointer auf *this
zerstört wurde. *Gulp*
(Der smart_ptr ist eine referenzzählende non-intrusive Implementierung, die
ich hier aus Platzgründen nicht posten möchte. Man nehme an, sie verhalte
sich, wie man es erwartet) Um das zu demonstrieren (und nur zur
Demonstration, das untenstehende Zeug macht so nicht viel Sinn):
---
struct A
{
void f();
};
smart_ptr<A> ptr;
void setPtr(smart_ptr<A> newA) { ptr = newA; } // (3)
void A::f() { setPtr( smart_ptr<A>(new A()) ); }
int main()
{
setPtr(smart_ptr<A>(new A())); // (1)
ptr->f(); // (2)
}
---
Hier wird wegen (2) in (3) im Zuweisungsoperator des smart_ptr delete auf
das in (1) erstellte A aufgerufen (und somit auch der Speicher
freigegeben). Nun darf nach delete x; ja auf x nicht mehr zugegriffen
werden, oder wie der Standard sagt: "The effect of using an invalid pointer
value [...] is undefined" (3.7.3.2, (4)). Ich frage mich jetzt, was denn
nun "using" genau heißt (vielleicht brauche ich eine neue Brille, aber ich
habe es nicht gefunden). Ist der Zeiger schon "geused", wenn er auf dem
Stack hin- und her"gepusht"/"popt" wird? Das könnte der Compiler bei der
Rückkehr von delete ja schon noch tun... Sprich: mich stört, daß es in
einer Memberfunktion passiert, in der this implizit vorhanden ist.
Bitte schlagt mir keine Alternativimplementierung vor. Ich bin mir bewußt,
daß das a) häßlich und b) unnötig ist. Ich habe mich nur an dieser Stelle
gefragt, ob dieser Code noch standardkonform ist oder nicht.
Danke schon mal im voraus
Markus
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Dec 15, 2003 3:48 pm Post subject: Re: Wann wird der this Zeiger "genutzt"? |
|
|
Markus Moll wrote:
| Quote: |
werden, oder wie der Standard sagt: "The effect of using an invalid pointer
value [...] is undefined" (3.7.3.2, (4)). Ich frage mich jetzt, was denn
nun "using" genau heißt (vielleicht brauche ich eine neue Brille, aber ich
habe es nicht gefunden). Ist der Zeiger schon "geused", wenn er auf dem
Stack hin- und her"gepusht"/"popt" wird?
|
'Using' bedeutet 'using', also: jegliche Verwendung, wozu auch immer.
int * p = new int;
delete p;
int * q = p; // 'using' p, -> undefined.
| Quote: | Das könnte der Compiler bei der
Rückkehr von delete ja schon noch tun...
|
Der Compiler selbst darf einiges was Du nicht darfst
Der Compiler kennt ja seine eigene Implementierung und darf
dieses Wissen auch benutzen.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| 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
|
|