delete(Object) 等价于调用 Object.~Object() 吗?

Is delete(Object) equivalent to calling Object.~Object()

本文关键字:Object 等价于 delete 调用      更新时间:2023-10-16

我有几个类连接到AngelScript引擎。这个引擎使用有趣的方法来分配对象:它分配所需的内存量(可能带有malloc()),当作者建议使用这样的构造来在这个内存中创建对象时:

static void Constructor(ObjectType *thisPointer)
{
    new(thisPointer) ObjectType();
}

并像这样编写代码来销毁对象:

static void Destructor(ObjectType *thisPointer)
{
     thisPointer->~ObjectType();
}

我有几个问题:

  • 以这种方式使用析构函数是正确的方法吗?(Eclipse认为这是一个bug)据我所知,这段代码应该在不释放内存的情况下调用析构函数(调用free()
  • 是否可以使用 delete(thisPointer)(或类似的东西)代替这种结构,它是等效的吗? (至少这段代码在编译和运行时没有给出错误)
  • 有没有其他方法可以在不释放内存的情况下调用析构函数?

提前谢谢你。

C++在这里有点误导:

构造和内存管理实际上是完全不相关的过程,为了方便起见,它们C++newdelete

中混合在一起。

但是,C++实际上没有专用语法来调用现有内存上的构造函数 - 为此,您需要使用"放置new"语法,这实际上根本不是传统的new - 即,它不分配内存。

另一方面,有一种语法可以调用对象的析构函数。并且您的代码正确使用它。不,使用 delete 不会等效,除了调用析构函数之外,它还会释放内存。

将其与具有方法(及其相应语义)的 std::allocator 类进行比较

  • allocate (== ::operator new(sizeof T)
  • deallocate (== ::operator delete(&x)
  • construct (== new (&x) T()
  • destroy (== x.~T()

这些与对象生命周期的不同方面精确对应。

以这种方式使用析构函数是正确的方法吗?

是的。您使用 placement-new 就地构造了对象,因此必须使用显式析构函数调用将其销毁(假设它具有非平凡析构函数)。

是否可以使用 delete(thisPointer)(或类似的东西)代替这种结构,它是等效的吗?

不。 delete将尝试使用operator delete()将内存释放到免费存储区;这仅在使用正常的new表达式分配(或者可能显式使用 operator new() )时才有效。

有没有其他方法可以在不释放内存的情况下调用析构函数?

没有。调用析构函数无疑是调用析构函数的最清晰、最简单的方法。