gpt4 book ai didi

C++重载运算符新删除,

转载 作者:行者123 更新时间:2023-11-30 02:01:58 24 4
gpt4 key购买 nike

您好,这有点复杂,所以如果其中任何一个没有意义,请告诉我,我们的团队正在编写一个 C++ 应用程序,我们之前已经重载了 operator new。最近我遇到了这篇文章: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 得到了一堆链接器错误:

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

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

我的问题:我希望 libcmt 看到我的宏(#define new new(FILE, FUNCSIG, LINE))它链接尝试并链接我定义的版本(使用调试宏)。

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

最佳答案

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

关于C++重载运算符新删除,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13635157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com