1

ご存知のように、メモリ リークを回避するには、共通ポインタではなく SmartPtr を使用してオブジェクトを管理する方がよいでしょう。

ほとんどの場合、非常にうまく機能します。

今、私は問題に遭遇しました。私はそれをより簡単に説明するために最善を尽くしました.

私は基本クラスを持っています:

class Base;

基本クラスから継承された別の 2 つのクラスがあります。

class Derive1 : public Base;

class Derive2 : public Base;

生のポインタを使えば、ポリモーフィックを簡単に実装できます;</p>

Base *pd1 = new Derive1();

Base *pd2 = new Derive2();

しかし、同じことを実装するために使用したい場合はsmartPtr、どうすればよいですか? 例えば:

SmartPtr<Base> pd1 = SmartPtr<Derive1>(new Derive1);

smartPtr変換をサポートするものはありますか、それとも のテンプレートを実装する必要がありますsmartPtrか?しかし、テンプレートを自分で実装する場合、コードの肥大化を回避するにはどうすればよいでしょうか?だれが良いアドバイスをくれますか?

この操作をサポートするテンプレート smartPtr がある場合、この機能をどのように実現しますか? 基本ポインターが派生オブジェクトを指すことができることはわかっていますが、それは悪いことです!!

4

4 に答える 4

1

std::unique_ptrまたはを使用して、独自のスマート ポインター テンプレートを実装する必要はありませんstd::shared_ptr

たとえば、これはポリモーフィックな動作を利用して、思い通りに機能します。

std::unique_ptr<Base> sptr1{new Derive1()};
std::unique_ptr<Base> sptr2{new Derive2()};

つまり、次のようにsptr1&sptr2を同じように使用できます。

Base* pd1 = new Derive1();
Base* pd2 = new Derive2();

sptr1&sptr2がスコープ外になると、デストラクタがBase::~Base()呼び出され、オブジェクトへの内部ポインタBaseが削除されます。仮想化して、破壊時におよびそれぞれ~Base()も呼び出します (スマート ポインターを使用しない場合と同じです)。~Derive1()~Derive2()

実際の例: http://ideone.com/zVebLV

別の派生オブジェクトをsptr1指摘するには、次のようにします。

sptr1 = sptr2; // This will destruct previous object pointed to by sptr1.
               // Will also set sptr2 = nullptr.

スマート ポインターの詳細: C++11 スマート ポインター ポリシー

于 2013-07-24T13:52:15.330 に答える
1

std::shared_ptr<T>またはについて話している場合unique_ptr<T>は、はい、そのケースを処理します。T*これは、この場合はBase*. ですから、そのように使用しても問題ありません。そうでなければ、それらはあまり役に立たないでしょう。

于 2013-07-24T13:45:15.917 に答える
1

「この行コードはどのように機能するべきですか?」と尋ねていると思いますか?

SmartPtr<Base> pd1 = SmartPtr<Derive1>(new Derive1);

私が持っている最善のアドバイスは、ブーストまたは同様のソースを調べることですshared_ptr. 基本的に、テンプレート化されたコンストラクターを使用して、ある共有ポインターを別の共有ポインターから構築できるようにします。明らかに、基になるポインター型は互換性がなければなりません...

template<class Y> shared_ptr( shared_ptr<Y> const & r )
: px( r.px ), pn( r.pn ) 
{
}

もちろん、最初にこれを代わりに書くだけで、これを避けることができます:-

SmartPtr<Base> pd1(new Derive1);
于 2013-07-24T14:27:59.147 に答える