Test für void-Zeiger in C ++ vor Löschen
-
27-09-2019 - |
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?
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 erlaubtchar *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.