Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

11

29.03.2009, 16:27

Vielleicht rufst du nach dem delete eine virtuelle Methode auf? Auch wenn diese nicht auf die Member zugreift würde das zu Fehlern führen, weil die vtable dann schon zerstört ist.
Ansonsten musst du schon mehr Code liefern..

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

12

29.03.2009, 16:29

Man sollte einfach nicht mehr auf die Instanz (deren Membervariablen oder VTable) zugreifen, nachdem sie gelöscht wurde.

Abgesehen davon ist von delete this abzuraten. Nicht nur, dass es unschön ist, wenn sich die Klasse selbst aufräumt - man zwingt den Benutzer, die Instanz auf dem Heap anzulegen.

Es gibt auf jeden Fall bessere Möglichkeiten, drakons Variante ist eine davon. Oder wenn es nur darum geht, sich nicht um die Freigabe zu kümmern, kann man auch Smart Pointer benutzen.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

13

29.03.2009, 16:31

delete this ist 100% legal und funktioniert, ich nutze es hauptsächlich
in Release() Funktionen.

mit dem delete wird nur der this-Zeiger ungültig, die methode
funktioniert trotzdem noch, darf nur nichts mehr mit this machen.

bei virtuelle funktionen gibt das probleme, da die auf den this-zeiger
angewiesen sind.

movs und cmps sind nicht erlaubt.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Anonymous

unregistriert

14

29.03.2009, 16:33

noch mal die frage: wo steht das delete this nicht geht?

15

29.03.2009, 16:46

Zitat von »"Gotbread"«

delete this ist 100% legal und funktioniert, ich nutze es hauptsächlich
in Release() Funktionen.
Wie gesagt: Es funktioniert nur bei Instanzen, die mit new angefordert wurden. Nicht mal mit new[] geht es.

Ich hätte es nicht gerne, wenn ich mich so stark einschränken müsste. Zum Glück gibt es bessere Wege. Für Release-Funktionen wäre RAII bestimmt geeigneter.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

29.03.2009, 17:31

Zitat von »"unsigned long"«

Nein, das Objekt in dem du gerade bist bei "DeleteMySelf" existiert nicht mehr, das bedeutet dass auch die Methode nicht mer existiert und du versuchst Code in einer Methode auszuführen die nicht mehr existiert.

Das bedeutet du führst Code im Null-Speicher aus.

Das ist nicht richtig. Die Methode ist ja kein Teil des Objekts. Die Methode ist im Prinzip eine normale Funktion, die noch den this-Zeiger übergeben bekommt. Die Methode wird nicht "gelöscht", wenn das Objekt gelöscht wird.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

29.03.2009, 17:33

Zitat von »"Nexus"«

Ich hätte es nicht gerne, wenn ich mich so stark einschränken müsste. Zum Glück gibt es bessere Wege. Für Release-Funktionen wäre RAII bestimmt geeigneter.


Oh, hie und da ist sowas ganz praktisch. Um sicherzustellen das solche Objekte auch richtig verwendet werden verwend ich gern folgendes Schema:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Blub
{
private:

  Blub(int arg);

  Blub(const Blub&);
  Blub& operator =(const Blub&);

  ~Blub();

public:

  static Blub* create(int arg)
  {
    return new Blub(arg);
  }

  void Release()
  {
    delete this;
  }

};


Damit ist garantiert das ein Blub Objekt mit new angelegt und mit delete freigegeben wird. RAII kannst du auf Blub Objekte mit entsprechenden Smart Pointern immer noch anwenden.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

29.03.2009, 17:40

C-/C++-Quelltext

1
2
3
4
5
6
7
struct foo
{
    void bar () { std::cout << "this: " << this; }
};
...
foo* f = 0;
f->bar ();


Das funktioniert wunderbar. Ist auch erlaubt, weil eben die Funktion implizit nur einen Zeiger auf die Instanz übernimmt und this-> automatisch anhängt, wenn man auf eine Membervariable zugreift und diese nicht überdeckt wird.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

29.03.2009, 17:49

Zitat von »"drakon"«

Das funktioniert wunderbar. Ist auch erlaubt, weil eben die Funktion implizit nur einen Zeiger auf die Instanz übernimmt und this-> automatisch anhängt, wenn man auf eine Membervariable zugreift und diese nicht überdeckt wird.


ne; auch wenns funktioniert is das imo undefiniertes verhalten weil du einen nullpointer dereferenzierst.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

20

29.03.2009, 17:55

Zitat von »"dot"«

Zitat von »"drakon"«

Das funktioniert wunderbar. Ist auch erlaubt, weil eben die Funktion implizit nur einen Zeiger auf die Instanz übernimmt und this-> automatisch anhängt, wenn man auf eine Membervariable zugreift und diese nicht überdeckt wird.


ne das gibt imo undefiniertes verhalten, weil du einen nullpointer dereferenzierst.


Ja, klar, wenn man es macht. Wenn nicht, dann ist das ganze sehr wohl erlaubt. Ich wollte damit nur sagen, dass es ja nur eine Funktion ist, die einen Zeiger übergeben bekommt. Man darf mit dem einfach nichts anderes machen, als man sonst auch mit (ungültigen) Zeigern machen darf. (zuweisen, ausgeben usw.) und dereferenzieren ist (wie bei allen ungültigen Zeigern) nicht erlaubt.

Werbeanzeige