あなたはこの表に従ってunique_ptr
デストラクタはT
が完了する必要があり、前方宣言された型T
ためunique_ptr<T>
を使用しますが、移動代入演算子としても(とreset
)、時:C++/pimpl:生ポインタまたはunique_ptr?より良い選択は何ですか?
https://stackoverflow.com/a/6089065/1794803
ので、
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);
};
:あなたの
pImpl
イディオムのために、それを正しく実装するには、(副作用として、非インラインそれらをマークし、)
delete
と
move assignment method
を宣言する必要が
しかし、std::unique_ptr
は動的メモリ用のRAIIソリューションであり、pImpl
はすでにクラス内にあり、とにかくデストラクタを作成する必要があります。クラスが存在するため、生のポインタを管理するほうが良いでしょうか?すでに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