我在我的程序中制作了一个小内存泄漏查找程序,但我的方法是重载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*的东西,但我不知道该怎么办.
回覆:
永远不要尝试全局重载新/删除
为什么每当有人尝试使用C++不那么常见的功能时,有人会表现得不应该这么做?
它一直都在做,这很常见,而且我没有为不这样做的公司工作过.
全局重载的new和delete非常有助于跟踪内存,内存错误,缓冲区溢出等.
在他们正确的思想中,没有人会通过一个包含数百万行代码的程序,并为每个类添加一个新的删除成员.那只是愚蠢的.
也许你可以通过一些预处理器魔术来做你想做的事:
#includeusing 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; }
我认为这里的问题是你的新参数配置文件与标准运算符new的参数配置文件不匹配,因此一个不会被隐藏(因此仍然被使用).
new和delete的参数配置文件需要如下所示:
void* operator new(size_t); void operator delete(void*, size_t);
void* ptr = new void[size];
不能这样做.修理它.
永远不要尝试全局重载新/删除.要么将它们放在基类中,要从此类派生所有对象,要么使用命名空间或模板分配器参数.为什么,你可能会问.因为如果你的程序不只是一个文件而且使用STL或其他库,你就会搞砸了.
这是new
VS2005 的蒸馏版操作员new.cpp
:
void * operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) if (_callnewh(size) == 0) { // report no memory static const std::bad_alloc nomem; _RAISE(nomem); } return (p); }