global operator new, new[], delete und delete[] überladen
-
Hallo an alle!
Ich habe in meinem Projekt ein Speichermanagement implementiert, das ein Logbuch über nicht freigegebenes führt.Dabei tritt folgendes Problem auf. Der Compiler (VC++ 2008 SP1) sagt folgendes:
1>MemoryManager.cpp memorymanager.h(75) : error C2375: 'operator delete': Neudefinition; unterschiedliche Bindung predefined c++ types (compiler internal)(24): Siehe Deklaration von 'operator delete' memorymanager.h(77) : error C2375: 'operator delete[]': Neudefinition; unterschiedliche Bindung 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\new(79): Siehe Deklaration von 'operator delete[]' memorymanager.cpp(84) : error C2264: 'operator delete[]': Fehler in der Funktionsdefinition oder Funktionsdeklaration, Funktion nicht aufgerufenDeklariert ist alles in MemoryManager.h:
////////////////////////////////////////////////////////////////// //Überladung und Ersetzung der globalen Operatoren new, new[], delete, und delete[] #ifdef _DEBUG /// @brief Im Debug: Kapselt MemoryManager::Alloc GT_API void * operator new(size_t Size, const char* StrFunction, DWORD dwLine, const char* StrFile); /// @brief Im Debug: Kapselt MemoryManager::Alloc GT_API void * operator new[](size_t Size, const char* StrFunction, DWORD dwLine, const char* StrFile); /// @brief Im Debug: Kapselt MemoryManager::Free GT_API void operator delete(void *pMemory); /// @brief Im Debug: Kapselt MemoryManager::Free GT_API void operator delete[](void *pMemory); //Anreicherung aller new-Aufrufe mit Debug-Infos #define new new (__FUNCTION__, __LINE__, __FILE__) #endifUnd definiert in MemoryManager.cpp
////////////////////////////////////////////////////////////////// //Überladung und Ersetzung der globalen Operatoren new, new[], delete, und delete[] #ifdef _DEBUG GT_API void * operator new(size_t Size, const char* StrFunction, DWORD dwLine, const char* StrFile) { return(GT::Core::MemoryManager::Instance().Alloc((DWORD)(Size), StrFunction, dwLine, StrFile)); } GT_API void * operator new[](size_t Size, const char* StrFunction, DWORD dwLine, const char* StrFile) { return(GT::Core::MemoryManager::Instance().Alloc((DWORD)(Size), StrFunction, dwLine, StrFile)); } GT_API void operator delete(void *pMemory) { return(GT::Core::MemoryManager::Instance().Free(pMemory)); } GT_API void operator delete[](void *pMemory) { return(GT::Core::MemoryManager::Instance().Free(pMemory)); } #endifWie löse ich das Problemchen?
-
Das ist zwar nur geraten, aber evtl. stört das GT_API-Makro. Zudem sollte in MemoryManager.cpp innerhalb des _DEBUG-#ifs ein #undef new stehen. Wurde <new> zuvor eingebunden?
-
Ohne Makro hab ich auch schon probiert: kein Erfolg.
new wird ganz am Anfang in MemoryManager.cpp ge-#undef-t.
Mit #include<new> kann ich jetzt zumindest schonmal die lib compilieren.
Aber er warnt:1>log.cpp(12) : warning C4291: 'void *operator new(size_t,const char *,DWORD,const char *)': Kein zugehöriger delete-Operator gefunden; Speicher wird nicht freigegeben, wenn die Initialisierung eine Ausnahme auslöst 1>memorymanager.h(71): Siehe Deklaration von 'operator new'die Anwendung geht garnicht zu compilieren.
Fehler:main.cpp(38) : warning C4291: 'void *operator new(size_t,const char *,DWORD,const char *)': Kein zugehöriger delete-Operator gefunden; Speicher wird nicht freigegeben, wenn die Initialisierung eine Ausnahme auslöst memorymanager.h(71): Siehe Deklaration von 'operator new' main.cpp(39) : warning C4291: 'void *operator new(size_t,const char *,DWORD,const char *)': Kein zugehöriger delete-Operator gefunden; Speicher wird nicht freigegeben, wenn die Initialisierung eine Ausnahme auslöst memorymanager.h(71): Siehe Deklaration von 'operator new' Verknüpfen... Demo02 Main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int,char const *,unsigned long,char const *)" (??2@YAPAXIPBDK0@Z)" in Funktion "_main". main.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
-
Gibt es vieleicht sons noch eine Möglichkeit, nicht freigegebene Speicherstückchen/Pages (wie immer die auch heißen) aufzulisten. zu loggen und freizugeben ohne andere Funktionen als new und delete zu benutzen?
Es soll auch einen gewissen Kofort haben.Sonst kann ich gleich ein Makro ala #define DEBUG_NEW(size) MemMgr.Alloc(size, __FILE__, __LINE__, ... schreiben.
Aber das will ich nicht.Gibt es in VC++ vieleicht integrierte Methoden für sowas?
-
Blaze schrieb:
Gibt es in VC++ vieleicht integrierte Methoden für sowas?
Schau mal hier: http://msdn.microsoft.com/en-us/library/e5ewb1h3.aspx
-
Funktioniert! Danke!

-
Also ich empfehle immer auch den VLD (Visual Leak Detector) gerne:
http://sites.google.com/site/dmoulding/vldBenutze den selbst noch gerne.
-
Wird ja immer besser! :xmas1:
-
Blaze schrieb:
Wird ja immer besser! :xmas1:
Ist ja fast, wie Weihnachten. :p
*SCNR*