0

私は次のようなスマートポインタクラスを作成しました:

template <class T>
class Owner
{
    T* m_p;
public:
    Owner(T *p=0) : m_p(p) {}
    ~Owner() { if (m_p) delete m_p; }
    T* operator ->() { return m_p; }
    T& operator *() { return *m_p; }
    // other members.
};

これはうまく機能しますが(auto_ptrブーストライブラリに似ています)、スマートポインタの動的配列をobjに格納するという要件があり、以下をサポートする必要があります。

1)新しいスマートポインターをスマートポインター配列に挿入して、配列のサイズを変更し、新しいobjの所有権を取得します。

2)その場で1つのスマートポインタを削除すると、リソースが解放されます。

3)配列を完成させると、すべてのオブジェクトが削除されます。

を使用することを考えてstd::vector<Owner<T> >いましたが、コピー/代入の動作のため、c ++のベストプラクティスではスマートポインターをstdコンテナーに格納しないことをお勧めします。これを実装するために、他にどのようなものを使用できますか?以下の例のOwnerArrのようなもの:

 class Adapter;

 class Computer
 { 
 public:
      Computer() {}
      ~Computer() { // adapters get freed automatically here. }

      void insertAdapter(Adapter* pAdapter) { m_adapters->appendOne(pAdapter); }
      OwnerArr<Adapter>   m_adapters;
 };

前もって感謝します!

4

1 に答える 1

0

Owner、またはstd::auto_ptr(廃止されたため、とにかく使用しないでください)は、実際にはコピーできないため、標準のコンテナーに保管することはできません。

C ++ 11には、次のものがあります。これは、移動可能ですがコピー可能ではない、std::unique_ptr置き換える単一所有権のスマートポインターです。auto_ptrこれは、コピーを伴うことを何もする必要がない限り、任意のコンテナに移動または配置できます。同じオブジェクトの所有権を共有するために複数のポインターが必要な場合は、std::shared_ptr代わりに使用できます。

何らかの理由で古い言語バージョンで立ち往生している場合、Boostは、標準のものに非常に類似したものを含むスマートポインター、またはに類似したポインターコンテナーを提供できます。shared_ptrOwnerArray

独自のリソース管理クラスをロールすることにした場合は、常に3のルールを覚えておいてください。表示するクラスは、暗黙的に生成されたコピーコンストラクターとコピー代入演算子を持っているため、2つのポインターが同じオブジェクトを所有し、削除しようとする可能性があります。これは非常に悪いことです。コピーを防ぐ(これらの関数を削除するか、(2011年より前に)実装なしでプライベートとして宣言する)か、ある種の安全なコピーセマンティクスを実装する必要があります。

于 2012-09-13T11:03:21.830 に答える