c++;重载运算符new delete, 这有点复杂,请让我知道如果这一切都没有意义,我们的团队正在编写一个C++应用程序,我们以前已经有了操作符新的重载。最近我遇到了这篇文章:关于如何通过内存分配获得调试信息

c++;重载运算符new delete, 这有点复杂,请让我知道如果这一切都没有意义,我们的团队正在编写一个C++应用程序,我们以前已经有了操作符新的重载。最近我遇到了这篇文章:关于如何通过内存分配获得调试信息,c++,overloading,new-operator,C++,Overloading,New Operator,应用程序中的所有文件#包括一个我们有编译时平台配置的文件,在该文件中我添加了以下内容: #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(

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

#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中得到了一系列链接器错误:

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

通过添加operator new的旧实现(不带附加参数),链接器可以成功链接所有内容

我的问题:我想让libcmt看到我的宏(#define new(FILEFUNCSIGLINE),因此当它链接时,请尝试链接我定义的版本(使用调试宏)


我怎样才能让它工作??(我还尝试使用VisualStudio中的属性表来定义宏)

您无法让它工作。如果在包含标准头的任何文件中定义了此宏,则行为未定义。当然,项目的正常发展将导致人们定义class local
operator new
,或使用placement new,或此宏将破坏的许多技术中的任何一种。它与
#define while if
处于大致相同的级别。即使您不使用标准库,在宏中重新定义关键字肯定会遇到麻烦。

您无法让它工作。如果在包含标准头的任何文件中定义了此宏,则行为未定义。当然,项目的正常发展将导致人们定义class local
operator new
,或使用placement new,或此宏将破坏的许多技术中的任何一种。它与
#define while if
处于大致相同的级别。即使不使用标准库,在宏中重新定义关键字肯定会遇到麻烦。

我认为库不会链接,因为它不是用重载的
new
运算符编译的。仅仅在你自己的代码中定义一个重载的
新的
,并不能神奇地让它出现在预构建的库中。正如@dreamlax所说,这是行不通的。这是微软在MFC中的一次黑客攻击,应该被击毙。如果在定义宏之后使用该关键字,则编写名为关键字的宏会产生未定义的行为。@PeteBecker我自己更喜欢一个好的老式圣经石刑。我认为库不会链接,因为它不是用重载的
new
操作符编译的。仅仅在你自己的代码中定义一个重载的
新的
,并不能神奇地让它出现在预构建的库中。正如@dreamlax所说,这是行不通的。这是微软在MFC中的一次黑客攻击,应该被击毙。如果在宏定义后使用关键字,则编写一个名为关键字的宏会产生未定义的行为。@PeteBecker我更喜欢老式的圣经中的石头砸死我自己。