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

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

1

29.03.2009, 15:21

Klasse zerstört sich selbst

Nach dem ich wieder (leider länger) auf der Suche nach höchst mysteriösen Absturzfehlern bin, ist mir ein Codefragment in ungefähr folgendem Schema aufgefallen:

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
CClass* g_OneAndOnly = NULL;

class CClass
{
public:
    CClass() {}
    ~CClass() {}

    void DeleteMySelf();
}

void CClass::DeleteMySelf()
{
    delete(g_OneAndOnly);
    g_OneAndOnly = NULL;
}


// ...

// Irgendwo anders wird dann das durchgeführt:

g_OneAndOnly = new CClass;
g_OneAndOnly->DeleteMySelf();
// ...

(Mir ist bewusst, dass das so jetzt nich gaaanz lauffähig ist. Natürlich kommt das in der Form auch nicht so vor, wollte nur das Prinzip veranschaulichen.)

Gesetzt den Fall, dass die "DeleteMySelf()" auch sonst wirklich nichts mehr macht, kann diese Selbstzerstörung zu irgendwelchen Fehlern führen?

2

29.03.2009, 15:38

So weit ich weiß führt es zu keinen Fehlern.
Aber warum schreibst du nicht

C-/C++-Quelltext

1
2
3
4
5
void CClass::DeleteMySelf() 
{ 
    delete this; 
    g_OneAndOnly = NULL; 
}

?^^

Zero

Anonymous

unregistriert

3

29.03.2009, 15:44

Du versuchst Code auszuführen IN einem Objekt das bereits zerstört wurde.

siehe:

C-/C++-Quelltext

1
2
delete this;
this->wert = 5;

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

29.03.2009, 15:47

Ich würde mal darauf tippen, dass du das Objekt zerstörst und dann später noch darauf zugreifst.

Warum machst du das da überhaupt so kompliziert? - Benutz doch das Meyers-Singleton..

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

29.03.2009, 16:11

Danke für die Antworten.

Nein das Objekt macht nichts mehr mit sich selbst. Der genannte Absturzfehler mit dem ich kämpfe hat (offensichtlich also) auch absolut gar nichts mit dem zu tun. Hab ja gesagt, dass ich auf der Suche bin.. is alles nbischen verzwickt ;)

Ich war mir nur nicht mehr ganz sicher, ob nicht das ein Grund für etwaige Fehler sein könnte.

Anonymous

unregistriert

6

29.03.2009, 16:16

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.

7

29.03.2009, 16:18

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 stimmt nicht. Memberfunktionen sind unabhängig von den Instanzen. Man kann sie sich wie globale Funktionen vorstellen, die implizit this als ersten Parameter nehmen.

Wäre ja nicht sehr sinnvoll, wenn der gleiche Code für jede Instanz kopiert würde.

Anonymous

unregistriert

8

29.03.2009, 16:19

Ich weiß, dass man noch ein "return;" ausführen kann aber kein movs und cmps mehr? Okay kann mich auch irren, hast du nen Link dazu?

9

29.03.2009, 16:20

Das mit dem "delete this" geht zu 100% benutze ich auch an einigen Stellen!

Zero

Anonymous

unregistriert

10

29.03.2009, 16:23

wo sagt denn einer das delete this nicht geht?!

Werbeanzeige