兩相結構採用以下形狀:智能指針是否需要兩階段構造?
struct something {
something()
: p1(NULL)
, p2(NULL)
{ }
~something() {
if (p1) delete p1;
if (p2) delete p2;
}
void initialize() {
p1 = new int(2);
p2 = new int(5); // May throw if allocation fails!
}
int* p1;
int* p2;
};
的點,這是一個天真的構造(即不看用於分配失敗)將泄漏存儲器:的局部構造的對象的析構函數是從來沒有所謂。
我的問題:下面的代碼是否安全,並且通過確認,智能指針是否消除了兩階段構造?
struct something {
something()
: p1(new int(2))
, p2(new int(5))
{ }
std::unique_ptr<int> p1;
std::unique_ptr<int> p2;
};
在'delete'之前不需要條件。嚴重的是,你沒有。刪除null非常好。 –
還有一些非拋類型的新的和刪除的內存分配,就像malloc()/ free()一樣。但即使分配本身沒有使用非拋出new/delete失敗,對象構造函數仍然可能拋出。 –
@KerrekSB注意。 :) –