我在我的程序中制作了一个小内存泄漏查找程序,但是 我的方法是重载new和delete(以及new []和delete []) 似乎没有做任何事情。
void* operator new (unsigned int size, const char* filename, int line)
{
void* ptr = new void[size];
memleakfinder.AddTrack(ptr,size,filename,line);
return ptr;
}
我重载new
的方式显示在上面的代码段中。我想这是操作员返回void *的东西,但我不知道该怎么办。
答案 0 :(得分:138)
RE:
永远不要尝试重载新/全局删除
为什么每当有人试图使用不太常见的C ++功能时,有人表现得不应该这样做?
它一直都在做,这很常见,我没有为没有这样做的公司工作过。
全局重载new和delete对跟踪内存,内存错误,缓冲区溢出等非常有帮助。
没有人会想要通过一个包含数百万行代码的程序,并为每个类添加一个新的删除成员。那真是太蠢了。
答案 1 :(得分:51)
也许你可以通过一些预处理器魔法来做你想做的事情:
#include <iostream>
using namespace std;
void* operator new (size_t size, const char* filename, int line) {
void* ptr = new char[size];
cout << "size = " << size << " filename = " << filename << " line = " << line << endl;
return ptr;
}
#define new new(__FILE__, __LINE__)
int main() {
int* x = new int;
}
答案 2 :(得分:12)
我认为这里的问题是你的新参数配置文件与标准运算符new的参数配置文件不匹配,因此一个不会被隐藏(因此仍然被使用)。
new和delete的参数配置文件需要如下所示:
void* operator new(size_t);
void operator delete(void*, size_t);
答案 3 :(得分:6)
void* ptr = new void[size];
不能那样做。解决它。
永远不要尝试全局重载新/删除。要么将它们放在基类中,要从此类派生所有对象,要么使用命名空间或模板分配器参数。为什么,你可能会问。因为如果你的程序不只是一个文件而且使用STL或其他库,你就会搞砸了。
以下是来自VS2005 new
的{{1}}运算符的简化版本:
new.cpp
答案 4 :(得分:4)
您是否正确调用了重载运算符,即将其他参数传递给它?
答案 5 :(得分:4)
问题依赖于您添加到重载的new运算符的两个参数。尝试以某种方式使文件名和行全局化(或者如果你为一个类重载new和delete,则为成员变量)。这应该会更好。