c ++重载运算符new delete,

时间:2012-11-29 21:34:52

标签: c++ overloading new-operator

嗨,这有点复杂,所以请告诉我,如果其中任何一个没有意义,我们的团队正在编写一个C ++应用程序,我们之前已经有过新的运算符重载。最近我遇到了这篇文章:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml关于如何通过内存分配获取调试信息。

应用程序中的所有文件#include包含编译时平台配置的文件,在该文件中我添加了以下内容:

#ifdef _DEBUG
void* operator new(size_t size, const char *filename, const char *funcname, int line);
void* operator new[](size_t size, const char *filename, const char *funcname, int line);
#define new new(__FILE__, __FUNCSIG__, __LINE__)
#endif

由于我们只为我们的平台构建链接了libcmt.lib,为了使用STL,我删除了我们旧的operator new实现,它看起来像:

// in a .cpp file:
void*
operator new(size_t size) { ... }

并将其替换为:

// in the same .cpp file as above...
#undef new
void* operator new(size_t size, const char *filename, const char *funcname, int line) { ... }
#define new new(__FILE__, __FUNCSIG__, __LINE__)

这适用于编译,但我从libcmt.lib得到一堆链接器错误:

ex:libcmt.lib(malloc.obj):错误LNK2001:未解析的外部符号__imp_HeapAlloc

添加运算符new的旧实现(没有附加参数)允许链接器成功链接所有内容。

我的问题:我想让libcmt看到我的宏(#define new new( FILE FUNCSIG LINE )),因此当它链接尝试并链接我定义的版本(与调试宏)。

我如何让这个工作? (我也尝试使用visual studio中的属性表来定义宏)

1 个答案:

答案 0 :(得分:4)

你无法让它发挥作用。如果在包含标准标头的任何文件中定义此宏,则行为未定义。当然,项目的正常演变将导致人们定义类本地operator new,或使用placement new,或者这个宏将破坏的许多技术中的任何一种。它与#define while if大致相同。即使您不使用标准库,在宏中重新定义关键字也是遇到麻烦的可靠方法。