c++重载运算符new delete
c++ overload operator new delete,
嗨,这有点复杂,所以如果这些都没有意义,请告诉我,我们的团队正在编写一个C++应用程序,我们之前已经重载了运算符new。最近我偶然发现了这篇文章:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml关于如何通过内存分配获得调试信息。
应用程序#中的所有文件都包括一个文件,其中我们有编译时平台配置,在该文件中我添加了以下内容:
#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,我删除了运算符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
添加回运算符new的旧实现(没有附加参数)可以使链接器成功地链接所有内容。
我的问题是:我想让libcmt看到我的宏(#define new new(FILE、FUNCSIG和LINE)),因此当它链接时,请尝试并链接我定义的版本(与调试宏)。
我该如何让它发挥作用??(我还尝试使用visualstudio中的属性表来定义宏)
你无法让它工作。如果在包含标准标头的任何文件中定义了此宏,则行为未定义。当然,一个项目的正常发展将导致人们定义类本地operator new
,或者使用placementnew,或者这个宏将打破的许多技术中的任何一种。它与#define while if
处于同一级别。即使不使用标准库,在宏中重新定义关键字也肯定会遇到麻烦。
相关文章:
- g++用户定义的动态链接库上的全局new和delete运算符
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 重载 new 和 delete 会导致 valgrind 错误
- 基类指针:在哪里使用 new 和 delete
- C++:为什么可以在没有事先使用 new 的情况下在指向结构的指针上使用 delete?
- 重载运算符 new 和运算符 delete 带有三个参数
- 如果我为一个类编写new和delete运算符,我是否必须编写它们的所有重载
- new[] / delete[] 并在C++中抛出构造函数/析构函数
- QQuickView new-delete-type-mismatch
- 使用重载的 new 和 delete 运算符跟踪已用内存
- 创建 myNew/myDelete 以替换 new/new[]/delete/delete[]
- 为多线程环境包装 c++ new/delete 的安全/好方法
- C++ VS:多 DLL 解决方案中的'new'和'delete'覆盖
- 如何使用 new 和 delete 与 OpenGL 的缓冲区对象一起使用?
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- 继承类上的运算符new和delete.操作员删除未执行
- 在不同的编译器版本中调用new[]和delete[]
- `delete []`on`int*````new'''给出了malloc错误
- C++内存分配失败(使用 new & delete)