2
class TClass
{
    class EmbeddClass
    {
        public:
        ....

        protected:
            virtual ~EmbeddClass() {}

    }   

    boost::scoped_ptr<EmbeddClass> scpEmbeddClass;
}

vs2010 は上記のコードに文句を言います。~EmbeddClassをパブリック関数として定義することで問題を解決できます。

質問>この問題の原因は何ですか?scoped_ptr のデストラクタが protected にアクセスできないため ~EmbeddClassですか? shared_ptr にはそのような問題はないように思えます。

ありがとうございました

4

2 に答える 2

1

質問>この問題の原因は何ですか?scoped_ptr のデストラクタが保護された ~EmbeddClass にアクセスできないためですか?

はい、まさにそれが問題です。

shared_ptr にはそのような問題はないように思えます。

オブジェクトを保存しているのではEmbeddClassなく、それから派生したタイプのオブジェクトをshared_ptr. その場合、共有ポインタのコンストラクタは、最も派生した型のデストラクタを呼び出すデリータshared_ptrを作成します (コンストラクタ / reset()/.. で見られるように)。最も派生した型はshared_ptr、型がベースに言及している場合でもによって破棄されるため、ベース デストラクタは呼び出されません。

于 2012-11-21T20:55:30.487 に答える
0

scoped_ptr のデストラクタが保護された ~EmbeddClass にアクセスできないためですか?

はい。

shared_ptr にはそのような問題はないように思えます。

リソースを複数所有できることに注意してください。shared_ptr初期化しない場合、または使用回数が 1 を超える場合は、deleter を呼び出す必要はありません。ただし、scoped_ptrより似unique_ptrているのは、リソースに対する一意の所有権を持ち、初期化しなくてもポインターを削除できることを確認することです。

基本的に、shared_ptrリソースを所有していない は保護されたデストラクタへのアクセスを必要としませんが、アクセスscoped_ptrunique_ptr必要です。

于 2012-11-21T21:22:32.873 に答える