重载新/删除

时间:2009-02-24 18:39:31

标签: c++ operator-overloading new-operator delete-operator

我在我的程序中制作了一个小内存泄漏查找程序,但是 我的方法是重载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 *的东西,但我不知道该怎么办。

6 个答案:

答案 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,则为成员变量)。这应该会更好。