2012-05-24 144 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'會調用一個沒有效果的調用。 –

相關問題