2012-05-24 71 views
6

我有几个类,我连接到AngelScript引擎。这款发动机采用有趣的方式来分配对象:它分配的内存(可能malloc()),当作者提出使用建筑像这样在这个内存中创建对象所需量:相当于调用Object的delete(Object)〜Object()

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

和这样的代码来破坏对象:

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

我有几个问题:

  • 是否使用析构函数这样正确的方式? (Eclipse的法官这个bug)至于我能理解这个代码应该调用析构函数,而不释放内存(主叫free()
  • 是否有可能使用delete(thisPointer)(或类似的东西),而不是这种结构,是这将是当量? (至少这段代码在编译和运行时没有提供任何错误)
  • 有没有其他方法可以在不释放内存的情况下调用析构函数?

在此先感谢您。

+0

找到“位置删除”找到[Stroustrup:C++风格和技巧常见问题](http://www2.research.att.com/~bs/bs_faq2.html#placement-delete),并简短回答问题“是否有“删除位置”?“ - “不,但如果你需要一个,你可以自己写。”也许这会帮助别人。 –

回答

5

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

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

是否有可能使用delete(thisPointer)(或类似的东西)而不是这种结构,它会是等价的吗?

编号delete将尝试使用operator delete()将内存释放到空闲存储;这只有在分配了正常的new表达式(或可能明确使用operator new())时才有效。

是否有其他方法调用析构函数而不释放内存?

不是。调用析构函数无疑是调用析构函数的最简单最简单的方法。

12

C++是有点误导这里:

施工和存储器管理实际上是完全不相关的进程,其C++ munges在一起newdelete为了方便。

然而,C++实际上并没有一个专门的语法来调用现有的存储构造 - 要做到这一点,你需要使用“放置new”语法这实际上是传统new在所有 - 即,它不分配内存。

另一方面,调用对象的析构函数的语法。而你的代码正确使用它。不,使用delete不等价,除了调用析构函数外,它还会释放内存。

std::allocator类,其具有方法(和它们相应的语义)

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

它们恰好对应于对象生命周期的不同方面。

+0

另外,为了强调这一点,'operator new'和'new'是两个不同的东西,即使它们看起来很相似。后者可能(!)称前者,但并不总是(在放置中 - 新变体)。 –

+0

所有'new'表达式调用'operator new()'的一些重载;放置'new'会调用一个没有效果的调用。 –

相关问题