1

これが私のシナリオです (簡潔にするために、アクセス許可とインスタンス変数を取り出し、関連するメソッドのみを取り出しました):

template <typename ItemType>
class LinkedList
{
    class Item
    {
        Item(ItemType theObj, bool freeObj);
        ~Item();
    };

    void add(LinkedList<ItemType>::Item item);
};

template <typename ItemType>
LinkedList<ItemType>::Item::~Item()
{
    if(freeObj) {
        delete obj;
    }
}

私のコードでは、次のように使用しました。

// works great
LinkedList<MyObject*> mylist;
mylist.add(LinkedList<MyObject*>::Item(new MyObject(), false));

// won't compile because you cannot use delete operator on a non-pointer
LinkedList<MyObject> mylist;
mylist.add(LinkedList<MyObject>::Item(MyObject(), false));

LinkedList<>::Item が実際のオブジェクトを解放してはならないという事実は脇に置いておきます。これは、テンプレートを理解するための質問です。ItemType がポインターである場合とそうでない場合に、Item デストラクタが処理する明示的なテンプレートを指定する必要があります。

これは可能ですか?潜在的な設計/漏れ穴の落下は何ですか? ありがとう。

4

2 に答える 2

0

答えは:しないでくださいポインターのコンテナーがある場合、コンテナーがpointeesを所有しているとは思いません。実際、誰もこれを予期していません。また、標準ライブラリ コンテナーはこのようには機能しません。

少なくとも、各要素のポインティがどのように割り当てられ、誰がそれらを所有しているかについて非論理的な仮定を行うことで、メモリ管理を大幅に混乱させています。

リストにはnewこれらのポインティが含まれていないため、対象外となりdeleteます。シンプル!

于 2013-11-06T03:20:37.320 に答える