13

cplusplus.comから:

生のポインターを含まないクラスに遭遇することはめったにありませんが、デフォルトのコピー コンストラクターでは十分ではありません。この例は、参照カウントされたオブジェクトがある場合です。boost::shared_ptr<> は例です。

誰かがこれについて詳しく説明できますか?を含むクラスがあるboost::shared_ptr場合、クラスがコピーを構築するときにコピーが構築されないので、shared_ptrコンストラクターは正しいことを行い、参照カウントを増やしませんか? たとえば、次のコードはInner正しくコピーされshared_ptrます。

#include <iostream>
using namespace std;

class Inner
{
public:
 Inner() { cout << "inner default constructed" << endl;}
 Inner(const Inner& other) { cout << "inner properly copied" << endl;}
};

class Outer
{
 Inner i;
};

int main() { Outer o; Outer p(o); return 0;}
4

3 に答える 3

20

デフォルトのコピー コンストラクターは、メンバー変数ごとにコピー コンストラクターを使用するか、組み込み型のビットごとのコピーを使用します。

ある種の共有ポインターを使用している場合、コピー コンストラクターは共有カウントをインクリメントし、元のオブジェクトと新しいオブジェクトの両方が同じオブジェクトを指すようになります。

場合によっては、これが必要です。ポインターをコピーし、参照カウントを正しく管理して、リソースが使用されなくなったときにリソースを解放できるようにします。

引用された記事の文脈は、オブジェクト全体をコピーすることにあります。この場合、各オブジェクトはそのサブオブジェクトの独自のコピーを持ち、サブオブジェクトを他のインスタンスと共有しないことが期待されます。この場合、shared_ptrはおそらく間違った選択であり、サブオブジェクトのディープ コピーは確実に行われません。

パラグラフの言い回しは悪いですが、ディープコピーについて話しているのは確かですが、それはディープコピーshared_ptrを提供しないと言っています。それはそれが設計されているものではないため、これは本当です。

于 2013-07-24T13:04:39.210 に答える
8

誰かがこれについて詳しく説明できますか?

あまり; それは意味不明です。

を含むクラスがあるboost::shared_ptr場合、クラスがコピーを構築するときにコピーが構築されないので、shared_ptrコンストラクターは正しいことを行い、参照カウントを増やしませんか?

それは正しい。shared_ptrは有効なコピー セマンティクスで適切に設計されているため、それを含むクラス オブジェクトをコピーするときに特別に処理する必要はありません。

おそらく、作成者は、共有オブジェクトを共有するのではなくコピーしたい場合は、新しいオブジェクトを作成するためのコピー コンストラクターが必要になることを意味していたのでしょう。shared_ptrただし、所有権を共有したくない場合にa を使用するのはかなり奇妙です。

于 2013-07-24T13:03:24.897 に答える