Frage

Ich habe ein Array in C ++:

Player ** playerArray;

, die im Konstruktor der Klasse initialisiert wird, ist es in.

Im destructor ich habe:

delete playerArray;

außer wenn das Programm durch Valgrind Testen sagt es, dass es einige Anrufe auf einen void-Zeiger zu löschen:

 operator delete(void*)

Ich möchte testen, ob die playerArray ist ein void-Zeiger vor dem Aufruf löschen, diesen Fehler zu vermeiden.

Wer weiß, wie dies zu tun?

War es hilfreich?

Lösung

Vielleicht bedeutete Sie delete [] playerArray. Sie müssen die [] wenn der Zeiger ein Array ist, nicht eine einzelne Instanz.

Andere Tipps

Hier ist, wie delete-Operator definiert ist.

void operator delete(void*) throw();
void operator delete[](void*) throw();

‚Operator delete‘ nimmt ‚void *‘ da ein Zeiger auf ein beliebiges Objekt kann auf ‚void *‘ umgewandelt werden.

Beachten Sie, dass ein Hohlraum ist ein unvollständiger Typ und daher ist es kein void * d.h

löschen erlaubt
char *p = new char;
void *pv = p;
delete pv;            // not allowed
  

Fußnote 78: Das bedeutet, dass eine   Objekt kann nicht gelöscht werden, eine mit   Zeiger vom Typ void * weil nichtig   nicht ein Objekttyp.

In dem Fall, wo playerarray ist ein Zeiger auf ein Array von Spielern, Sie wahrscheinlich wollen es anders machen. delete pplayer nicht tun, was Sie wollen es.

Ich denke, was valgrind warnt, ist, dass das Löschen wird im Rahmen von so etwas wie diese auftreten:

int foo(void *mydata){
{
    SomeClass some_value = static_cast<SomeClass> mydata;
    some_value.dosomething();
    // now we're done with it
    delete mydata;
}

obwohl die Besetzung ist in Ordnung, da Sie wissen, passieren, dass der void-Zeiger ist eigentlich, dass Typ, du bist immer noch etwas faul zu tun, weil Sie den void-Zeiger sind zu löschen, anstatt die typisierten Zeiger. Wenn Someclass POD ist, die wahrscheinlich ist ok , aber wenn es einige kritische Arbeit hat es in seinem destructor tun muss, dass destructor nie aufgerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top