當您使用unique_ptr<T>
成正向聲明的類型T
,該unique_ptr
析構函數需要T
完成,但此舉賦值運算符,以及(和reset
),根據該表:C++/pimpl:原始指針還是unique_ptr?什麼是更好的選擇?
https://stackoverflow.com/a/6089065/1794803
所以,爲您pImpl
成語,要正確實現它,你必須聲明delete
和move assignment method
(其中,作爲副作用,標誌着他們非內聯):
class impl_t;
class A
{
std::unique_ptr<impl_t> p_impl;
public:
// Implement in A.cpp as A::~A() = default;
~A();
// Implemented in A.cpp as A& operator=(A&&) = default;
A& operator=(A&& he);
};
但是,由於std::unique_ptr
是動態內存的RAII解決方案,並且您已經在一個類中,並且您不得不寫一個析構函數,所以管理一個原始指針不是更好,因爲您的類是已經是RAII般從視圖的p_impl
點:
class impl_t;
class A
{
impl_t* p_impl;
public:
~A(); // The destructor must be written anyway.
// The omitted move assignment destructor doesn't cause UB.
};
是不是一個更好的解決方案? (+如果您想要課程可以複製/移動,則定義或刪除您自己的複製/移動操作符;但這是「有意識的選擇」;但是,不要寫作unique_ptr
的移動任務是錯誤的)。
使用unique_ptr
只能在不得不聲明的析構函數中寫入delete p_impl
。
unique_ptr
對於即使在例外的情況下也會被破壞的局部動態對象來說是一個很好的選擇,但對於「屬性」來說,除了獲得UB的可能性,如果你不記得你必須重寫這個移動賦值運算符。
此外,沒有定製刪除器的'std :: unique_ptr'在優化之後就可以與原始指針進行比較。 – skypjack