2016-05-31 463 views
1

是否需要在代碼中包裝std::unique_ptr使用try/catch應該是異常安全的?
std::unique_ptr將保存由::malloc創建的原始內存塊(使用我的定製刪除程序調用::free)。std :: unique_ptr和異常安全

+3

'malloc'和'free'是c函數。他們不能扔。那麼你想「抓」什麼樣的例外? – mkaes

+3

'unique_ptr'不會產生異常。 –

回答

6
  1. 所有的std::unique_ptrconstructors *爲noexcept
  2. malloc不會拋出失敗任何異常......它只是返回nullptr
  3. 我相信你的刪除者的構造函數不會拋出任何東西。

所以你不需要去捕捉任何東西,因爲什麼都不會拋出。


*:見C++ 11個§20.7.1.2.1unique_ptr構造[unique.ptr.single.ctor]

1

正如評論所說,這個答案是相關的C++ 14只有

儘管@keenyt了很好的答案,這是值得說std::make_unique<T>可以拋出,即使的std::unique_ptr構造函數是noexcept
實際上,上面提到的語句是否拋出主要取決於涉及的類型T的構造函數。

至於從cppreference.comstd::make_unique一個例子:

可能拋出的std :: bad_alloc的或T的構造函數時拋出一個異常被拋出任何異常,這個功能沒有任何影響。

,則回答的改進將是:不,你不需要try/catch塊,除非您使用std::make_unique和你T類型的構造函數可以拋出。

+0

是的。你是對的。但'std :: make_unique'是在C++ 14中引入的。但我的問題是關於C++ 11。 – denys

+0

@denys哦,對不起,我沒有看到標籤。如果您願意,我會刪除答案。 – skypjack

+0

無論如何,我認爲它很有幫助。只要提及它與C++ 14有關。 – denys