6

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

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

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

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

我有几个问题:

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

先感谢您。

4

2 回答 2

12

C++ 在这里有点误导:

构造和内存管理实际上是完全不相关的过程,C++为了方便new而将它们混合在一起。delete

然而,C++ 实际上并没有专门的语法来调用现有内存上的构造函数——为此,您需要使用new实际上根本不是常规的“放置”语法new——即,它不分配内存。

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

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

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

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

于 2012-05-24T13:13:15.677 回答
5

以这种方式使用析构函数是否正确?

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

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

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

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

并不真地。调用析构函数当然是调用析构函数最清晰和最简单的方法。

于 2012-05-24T13:15:52.463 回答