是否在重载的运算符删除函数中隐式调用析构函数?

Tim*_*ing 8 c++ destructor delete-operator

我有一个类Item,它定义了自己的operator new和operator delete,如下所示:

class Item
{
public:
    Item(const std::string &s):msg(s)
    {
        std::cout<<"Ctor: "<<msg<<std::endl;
    }
    static void* operator new(size_t size, int ID, const std::string &extra)
    {
        std::cout<<"My Operator New. ID/extra: "<<ID<<"/"<<extra<<std::endl;
        return ::operator new(size);
    }
    static void operator delete(void* p)
    {
        std::cout<<"My Operator Delete"<<std::endl;
        return;
    }
    ~Item()
    {
        std::cout<<"Destructor: "<<msg<<std::endl;
    }
    void Print()
    {
        std::cout<<"Item::msg: "<<msg<<std::endl;
    }
private:
    std::string msg;
};
Run Code Online (Sandbox Code Playgroud)

我使用placement new创建了这种类型的对象,然后删除如下:

int main()
{
    Item *pI=new(1,"haha")Item("AC Milan");
    std::cout<<"before delete"<<std::endl;
    delete pI;
    std::cout<<"after delete"<<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

My Operator New. ID/extra: 1/haha
Ctor: AC Milan
before delete
Destructor: AC Milan
My Operator Delete
after delete
Run Code Online (Sandbox Code Playgroud)

如您所见,delete pI调用我自己的删除功能,除了输出日志之外没有任何操作.但是,从输出Item中调用析构函数,delete pI在我自己的删除函数中不调用析构函数.

那么在这种情况下,析构函数会在重载删除函数中隐式调用吗?

son*_*yao 5

那么在这种情况下,析构函数将在重载的delete函数中隐式调用吗?

是。对于delete表达式,(1)首先调用析构函数,然后(2)operator delete调用apporiate ;名称查找和重载解析将在此阶段执行。

如果expression不是非空指针,则delete表达式将为要销毁的对象或销毁数组的每个元素(从数组的最后一个元素到第一个元素)调用析构函数(如果有)。

此后,除非匹配的new-expression与另一个new-expression(自C ++ 14开始)组合在一起,否则delete表达式将调用释放函数,operator delete(对于表达式的第一个版本)或operator delete[](对于表达式的第二个版本) )。