28

我在我的程序中做了一个小内存泄漏查找器,但是我重载 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* 的问题,但我不知道该怎么做。

4

5 回答 5

56

也许你可以用一点预处理魔法来做你想做的事:

#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;
}
于 2009-02-24T18:56:23.320 回答
12

我认为这里的问题是您的 new 参数配置文件与标准 operator new 的参数配置文件不匹配,因此不会隐藏(因此仍在使用)。

您的新建和删除参数配置文件需要如下所示:

void* operator new(size_t);
void operator delete(void*, size_t);
于 2009-02-24T18:48:26.473 回答
10
void* ptr = new void[size];

不能那样做。修理它。

永远不要尝试在全局范围内重载 new/delete。要么将它们放在基类中并从此类派生所有对象,要么使用命名空间或模板分配器参数。为什么,你可能会问。因为如果您的程序不仅仅是一个文件并且使用 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);
}
于 2009-02-24T18:44:24.517 回答
4

您是否正确调用重载运算符,即传递附加参数?

于 2009-02-24T18:43:52.070 回答
4

问题取决于您添加到重载的 new 运算符的两个参数。尝试以某种方式使文件名和行全局化(或者如果您为单个类重载 new 和 delete 则为成员变量)。那应该会更好。

于 2009-02-24T18:45:07.043 回答