我已经创建了一个覆盖新(和删除)运算符的BaseObject类,因此可以在应用程序生命周期中创建和销毁内存时记录内存,从而使我很容易发现所有未释放的内存。
但是,我在编译时遇到以下错误(但可以正常运行):
resourcemanager.h(36):警告C4291:'void * BaseObject :: operator new(size_t,const char *,int)':未找到匹配的运算符删除;如果初始化引发异常,则不会释放内存
baseobject.h(8):注意:请参见“ BaseObject :: operator new”的声明
我的BaseObject类如下:
class BaseObject
{
public:
void* operator new(size_t size,const char* file,int line);
void* operator new[](size_t size,int line);
void operator delete(void* ptr);
void operator delete[](void* ptr);
};
#define MY_NEW new(__FILE__,__LINE__)
#define MY_DELETE delete(__FILE__,__LINE__)
从我在Internet上阅读的内容来看,问题是由于被覆盖的删除操作符需要匹配的签名。因此,在这种情况下,如果我将“ const * char file,int line”添加到删除运算符,则它应该可以工作。但是后来又遇到了另一个问题,因为我找不到任何匹配的删除运算符(现在必须将文件和行作为输入),因此无法在任何对象上调用删除。在这种情况下,无法使用上面的MY_DELETE宏,因为删除不能使用类似的参数。
这里很茫然。
编辑:
解决方案不是立即显而易见的。用与新功能相同的额外参数添加重写的删除功能是不够的,因为这会产生“没有非放置删除运算符”的问题。反过来,可以通过添加非放置删除运算符来解决。因此,该类现在看起来像这样(并且正在工作):
class BaseObject
{
public:
void* operator new(size_t size,int line);
// Placement delete functions,matching overridden new functions
void operator delete(void* ptr,int line);
void operator delete[](void* ptr,int line);
// Non-placement delete functions
void operator delete(void* ptr);
void operator delete[](void* ptr);
};