是否总是会为删除操作符调用析构函数,即使它已被重载?

Max*_*xVT 3 c++ destructor operator-overloading

我正在将一些旧的代码从C转移到C++.旧的代码使用类似对象的语义,并且在一个点上,从解放了现在未使用的内存,搭配分离物件破坏的东西之间发生的:

Object_Destructor(Object *me) { free(me->member1), free(me->member2) }

ObjectManager_FreeObject(ObjectManager *me, Object *obj) { free(obj) }
Run Code Online (Sandbox Code Playgroud)

在C++中使用标准的析构函数(~Object)以及随后的调用是否可以实现上述功能delete obj?或者,我担心,这样做会将析构函数调用两次?

在特定情况下,所述operator deleteObject被覆盖为好.我在其他地方读过的定义("当使用operator delete时,对象有一个析构函数,总是调用析构函数)在重写的运算符中是正确的吗?

Mot*_*tti 6

delete operator是用来释放内存,它不会改变的析构函数是否被调用或没有.首先调用析构函数,然后才delete operator用于解除内存释放.

换句话说,用C++的析构函数和删除运算符来实现你的目标是不可能的.

样品:

#include <iostream>
#include <new>
using namespace std;

struct foo {
    ~foo() { cout << "destructor\n"; }
    void operator delete(void* p) { 
        cout << "operator delete (not explicitly calling destructor)\n"; 
        free(p);
        cout << "After delete\n"; 
    }
};

int main()
{
    void *pv = malloc(sizeof(foo));
    foo* pf = new (pv) foo; // use placement new
    delete pf;
}
Run Code Online (Sandbox Code Playgroud)

输出:

析构函数

operator delete(不显式调用析构函数)

删除后