重载新/删除
我在我的程序中做了一个内存泄漏查找程序,但我的方式超载新的和删除(也是新的[]和删除[])似乎没有任何事情。
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 *的东西,但我不知道该怎么办。
void* ptr = new void[size];
不能这样做。 修理它。
永远不要尝试全局超载新/删除。 要么将它们放在基类中,并从此类派生所有对象,或使用名称空间或模板分配器参数。 为什么,你可能会问。 因为如果你的程序不止一个文件,并且使用STL或其他库,你将会搞砸了。
以下是VS2005 new.cpp
中new
运算符的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); }
回覆:
永远不要尝试全局超载新/删除
为什么每当有人试图使用C ++的一个不太常见的function时,有人会像以前一样行事?
这是一直做的,这是相当普遍的,我没有为没有这样做的公司工作。
全局重载的new和delete在跟踪内存,内存错误,缓冲区溢出等方面非常有用。
没有一个人正确的思想是要通过一个有数百万行代码的程序,并为每一个class级添加一个新的和删除的成员。 这只是愚蠢的。
也许你可以用一点预处理器的魔法来做你想做的事情:
#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; }
我认为这里的问题是,你的新参数configuration文件不符合标准运算符new,所以没有被隐藏(因此仍然被使用)。
新的和删除的参数configuration文件需要如下所示:
void* operator new(size_t); void operator delete(void*, size_t);
你是否正确地调用了重载操作符,即传递它的附加参数?
这个问题依赖于你已经添加到重载的new运算符的两个参数。 尝试以某种方式创build文件名和行全局(或如果你重载新的和成员variables,单个类删除)。 这应该会更好。