2017-01-12 82 views
4

我看着CppCon 2014年,大約是提供了一個C API到C的"Hourglass API" talkcompanion code ++庫主要是通過包含具有C簽名的函數的類的成員函數。新T(...)主場迎戰的std :: make_unique <T>(...)。釋放()

除此之外,我一直對如何構造對象感興趣。在功能hairpoll_construct該構造新的對象hairpoll,指針是由

std::make_unique<hairpoll>(person).release() 

這實際上是所謂的用於處理異常的函數內獲得。一種更簡單的方法是使用純粹的方式

new hairpoll(person) 

什麼情況下,前者是可取的?這是否與這個peticuliar API的工作方式有關?還是比這更一般?

+0

如果可能,可能不再使用'new'。 – Jarod42

回答

2

如果構造函數拋出,new表達式會在傳遞異常之前自動分配內存。

作者可能認爲有必要使用臨時unique_ptr來實現這一點。

我不知道有任何優勢。

¹除非類定義了一個分配器功能,operator new,沒有相應的釋放器功能,operator delete。一旦這是Microsoft的MFC類庫中調試功能的情況。內存泄漏,但只在調試版本中。

+0

關於您的腳註,我不確定作者(S. Du Toit)是否因爲'hairpoll_destruct'使用'delete'而避免使用'new',因此記住了這種情況。 – user1735003

+1

@ user1735003:那麼,'unique_ptr'不會有任何幫助。除了構造函數的一個例外,'unique_ptr'中的指針成員甚至沒有被賦值/初始化。異常會阻止那裏發生的任何事情,並且'unique_ptr'沒有完全構造,所以它的析構函數沒有被調用,所以'unique_ptr'不會參與清理。 –

相關問題