Override new operator in C++ while crtdbg.h is causing conflicts

后端 未结 4 399
独厮守ぢ
独厮守ぢ 2021-02-02 04:48

While trying out some memory tracking and preparation for my own memory manager, I tried to override the new operator. The article on flipcode was my main guideline in this proc

相关标签:
4条回答
  • 2021-02-02 04:55

    On Visual Studio 2010, I was able to do this without redefinition of new or custom defined new. I created a header file with the following:

    #pragma once
    //_CRTDBG_MAP_ALLOC
    //_CRTDBG_MAP_ALLOC_NEW
    #define _CRTDBG_MAP_ALLOC
    #define _CRTDBG_MAP_ALLOC_NEW
    #include <stdlib.h>
    #include <crtdbg.h>
    

    and forced its inclusion on every source file, with the already discussed option Forced Include File, in the Project Settings / Configuration Properties / C/C++ / Advanced. Actually, crtdbg.h already do this custom definition of new, along with undefinition of regular new. And just to make sure everything would run smoothy, I added _CRTDBG_MAP_ALLOC and_CRTDBG_MAP_ALLOC_NEW to Preprocessor Definition list, available in: Project Settings / Configuration Properties / C/C++ / Preprocessor.

    Hope this will help on this issue.

    0 讨论(0)
  • 2021-02-02 04:56

    In one application of ours we resorted to renaming everywhere at the application level new with xnew and then defining the debug macro as acting only on xnew.

    Using new and redefining it as a macro can have problems also with custom allocators. Unfortunately C++ syntax for allocation made debugging wrappers harder to do.

    0 讨论(0)
  • 2021-02-02 05:12

    Try _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); -- as described in my blog post, no new redefinition needed.

    0 讨论(0)
  • 2021-02-02 05:15

    Allright, the way I solved it for now, without having to use a custom 'new' define is that I've made a generic header file, let's say 'Engine.h' that is included in every file. This can be enforced by using the Forced Include File in the Project Settings / Configuration Properties / C/C++ / Advanced.

    This file contains the #define (removed from the memdebug.h)

    engine.h

    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>
    
    #include <windows.h>
    
    #include "MemoryNappy.h"
    
    #define DEBUG_NEW new(__FILE__, __LINE__)
    #define new DEBUG_NEW
    

    This enforces the system to consider the crtdbg.h before the custom new-define and won't be changing the new there. The second time it's included somewhere down the line, it's just using the data that has already been loaded before. (In the case of including <iostream> after the include of "engine.h").

    Please note that overriding the new operator is still risky business when using third party libraries that might do the same trick. This causes the new operator for those files to be rewritten using the pattern used here. In that case you might want to reconsider the usage of a custom new define as in this fragment:

    #define myNew new(__FILE__, __LINE__)
    

    (Also described in http://www.flipcode.com/archives/Detecting_Memory_Leaks.shtml)

    0 讨论(0)
提交回复
热议问题