delete(Object)是否等效于调用Object .~Object()

Yur*_*kiy 6 c++ memory

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

static void Constructor(ObjectType *thisPointer)
{
    new(thisPointer) ObjectType();
}
Run Code Online (Sandbox Code Playgroud)

和这样的代码来销毁对象:

static void Destructor(ObjectType *thisPointer)
{
     thisPointer->~ObjectType();
}
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

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

先感谢您.

Kon*_*lph 12

C++在这里有点误导:

建筑和内存管理实际上是完全不相关的进程,其C++ munges在一起newdelete为了方便起见.

但是,C++实际上并没有专门的语法来调用现有内存上的构造函数 - 要做到这一点,你需要使用new实际上根本不是传统的"placement "语法new- 即它不分配内存.

在另一方面,存在一个语法来调用对象的析构函数.并且您的代码正确使用它.不,使用delete不等同,除了调用析构函数之外,它还会释放内存.

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

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

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


Mik*_*our 5

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

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

是否可以使用delete(thisPointer)(或类似的东西)而不是这种结构,它是否相同?

否.delete将尝试使用operator delete()将内存释放到免费商店; 这仅在分配了正常new表达式(或者可能是明确使用operator new())时才有效.

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

并不是的.调用析构函数当然是调用析构函数的最清晰,最简单的方法.