none
重载全局 operator delete 与 mfc 冲突 RRS feed

  • 问题

  • 试想一个程序分为两个部分,MFC 相关的部分,非 MFC 相关的部分,静态链接 nafxcwd.lib 和 libcmtd.lib。

    在 DEBUG 版本中,我需要追踪 MFC 部分的内存分配和释放情况,所以对这部分的代码添加宏:

    #define new DEBUG_NEW

    并且打算对非 MFC 部分的内存分配采用我自己的内存分配函数和释放函数。

    但是我发现,在 afxmem.cpp 中有重载下面 4 个全局函数:

    void* __cdecl operator new( size_t nSize )
    void __cdecl operator delete( void* p ) void* __cdecl operator new[]( size_t nSize ) void __cdecl operator delete[]( void* p )

    这样我就没法对非 MFC 部分的内存分配采用自己的函数了。

    即类似如下做法:

    __inline void *operator new( size_t s, int t1, int t2, char *fileName, int lineNumber ) {
            return Mem_Alloc( s, fileName, lineNumber );
    }
    __inline void operator delete( void *p, int t1, int t2, char *fileName, int lineNumber ) {
            Mem_Free( p, fileName, lineNumber );
    }
    __inline void *operator new[]( size_t s, int t1, int t2, char *fileName, int lineNumber ) {
            return Mem_Alloc( s, fileName, lineNumber );
    }
    __inline void operator delete[]( void *p, int t1, int t2, char *fileName, int lineNumber ) {
            Mem_Free( p, fileName, lineNumber );
    }
    #define new new(0, 0, __FILE__, __LINE__)

    因为我不能重载全局的 operator new 和 operator delete 函数(会导致链接错误),但是像上述这样的做法就不可能调用到我的 operator delete,而 operator new 缺被我替换掉了,这样虽然可以编译过,但是运行时会出错。

    除非我将所有的代码中的 delete 和 delete [] 显式替换成 5 个参数的版本,或者为每个类重载一份 operator new 和 operator delete。

    所以大家有什么更加好的方法吗?谢谢!


    2013年2月20日 17:35

答案

全部回复