operator delete
-
Moin,
ich habe mir einen operator new geschrieben:
void * operator new(size_t nSize, const char* pFilename, int nLine)
Den rufe ich über ein define auf, damit ich später wieder auf den Orginal operator new zurüchgreifen kann.
#ifdef _DEBUG #define New new(__FILE__, __LINE__) #endif
Jetzt würde ich gerne das selbe für den operator delete machen, allerdings bekomme ich das nicht hin.
void operator delete(void* ptr, const char* pFilename, int nLine) #ifdef _DEBUG #define Delete delete(__FILE__, __LINE__) #endif ... int* bla = New int; ... Delete bla; //hier treten die Fehler auf ...
Wenn ich jetzt mit Delete den Speicher freigeben möchte, bekomme ich folgende Fehlermeldungen:
error C2541: 'delete' : cannot delete objects that are not pointers
error C2146: syntax error : missing ';' before identifier 'bla'Gibt eine Möglichkeit, delete genauso zu benutzen wie new???
-
Nein. Zumindest ist mir keine gute Lösung bisher bekannt. Und ich stand auch schon vor dem besagten Problem. Du kannst delete keine expliziten Parameter mitgeben. Dein define müsste also wie folgt aussehen
#ifdef _DEBUG #define Delete delete #endif
Du musst allerdings trotzdem für jede operator new Funktion ein entsprechendes delete Gegenstück bereitstellen.
void * operator new(size_t nSize, const char* pFilename, int nLine) void operator delete(void* ptr, const char* pFilename, int nLine)
Es gibt allerdings einen Trick, mit dem du dir behelfen kannst
#define my_delete delete_request(__FILE__, __LINE__), delete
Mittels delete_request speicherst du alle benötigten Infos, so dass operator delete dann Zugriff darauf hat. Das einzige was hier zu beachten ist, ist Thread Synchronisation (sofern mehrere Threads verwendet werden).
-
Danke erst einmal.
So funktioniert es leider nicht.
#define my_delete delete_request(__FILE__, __LINE__), delete
Habe wo anders folgendes gefunden mit dem es funktioniert, allerdings verstehen ich nicht ganz warum es damit geht.
#define new (new_request (__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new
-
Lupus schrieb:
So funktioniert es leider nicht.
#define my_delete delete_request(__FILE__, __LINE__), delete
Kannst du mal genauer sagen, warum es bei dir nicht funktioniert? Ich hatte damit bisher noch keine Probleme.
Lupus schrieb:
Habe wo anders folgendes gefunden mit dem es funktioniert, allerdings verstehen ich nicht ganz warum es damit geht.
#define new (new_request (__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new
Wo liegen denn die Verständnisprobleme? Beim Code selbst oder woanders?
-
Habe es heute noch einmal getestet und jetzt funktioniert das, muss ich wohl einen Fehler an anderer Stelle gehabt haben, den ich auf das Makro zurückgeführt hatte.
#define new (new_request (__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new
Was macht das false da in dem Makro? Bewirkt das false, dass NULL nie ausgeführt wird?
Funktioniert das genauso wie folgendes:#define new new_request (__FILE__,__LINE__,__FUNCTION__), new
-
Lupus schrieb:
Was macht das false da in dem Makro? Bewirkt das false, dass NULL nie ausgeführt wird?
So könnte man das sagen. Der Ausdruck
(new_request (__FILE__,__LINE__,__FUNCTION__),false)
liefert ja immer false. Dementsprechend wird der trinäre Operator NULL nicht verarbeiten, sondern new.
Lupus schrieb:
Funktioniert das genauso wie folgendes:
#define new new_request (__FILE__,__LINE__,__FUNCTION__), new
Im Grunde, ja. Wenn ein Compiler die Version mit dem trinären Operator vernünftig optimiert, sollte sogar exakt der gleiche Maschinencode dabei herauskommen.
-
Vielen Dank für die Hilfe, dank dir habe ich wieder einiges gelernt.