找不到匹配的运算符删除;如果初始化引发异常,则不会释放内存

我已经创建了一个覆盖新(和删除)运算符的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);
};
ranran4 回答:找不到匹配的运算符删除;如果初始化引发异常,则不会释放内存

来自cppreference https://en.cppreference.com/w/cpp/language/new

  

如果初始化因抛出异常而终止(例如,   构造函数),如果new-expression分配了任何存储空间,则会调用   适当的释放函数:operator delete用于非数组类型,   operator delete[]用于数组类型。看释放功能   如果new表达式使用::new语法,则在全局范围内,   否则,如果T是类类型,则在T的范围内查找。如果   失败的分配函数是常规的(非放置),查找   释放功能遵循   删除表达式。 对于失败的新展示位置,所有参数类型,   除了第一个,匹配的释放函数必须是   与展示位置new的参数相同。呼吁   释放函数是从先前从   分配函数作为第一个参数传递,对齐方式作为   可选的alignment参数(自C ++ 17起)和placement_params,   如果有的话,作为附加的放置参数传递。如果不   找到释放功能,内存未释放。

因此您要删除的匹配签名是:

  1. 带走size
  2. void* ptr放在其位置
  3. 重复传递给operator new的参数。

这导致:

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,int line);
    void operator delete[](void* ptr,int line);
};

离题:abstract不是C ++中的关键字,这应该是编译错误。要使类抽象,请将函数定义为纯虚函数(通过将= 0作为其定义)。

本文链接:https://www.f2er.com/3166376.html

大家都在问