智能指针或矢量矢量的常规指针

时间:2014-07-19 07:52:13

标签: c++ pointers vector

我想知道如果我使用智能指针来处理vector的向量,是否会出现任何问题。我正在制作一个容器对象,它将保存派生对象(包括其他容器),我想使用智能指针进行自我删除并想使用unique_ptr用于单一所有权,但在这种情况下不能使用它。

每个容器都有一个大小,所以最后一个容器不能包含第一个容器,这样可以防止我为shared_pt读取的问题之一。

class Base{...}

class Item:public Base{...}

class Container : public Base{
    //int size;
    vector<shared_ptr<Base>>vec;
public:
     template <typename D>
     void AddItem(const D& thing) {
     vec.push_back(make_shared<D>(thing));
     }
};

Container bag;
Item thing;
Container bag2;

bag2.AddItem<Item>(thing);

bag.AddItem<Container>(bag2);

// _________________________

相关,为什么不这样做

class Container :public Base{
vector<Base*>slot;
public:
~Container(){}

void Add(Base* thing){ slot.push_back(thing); }

void Delte_All()
{
    for(int i=0;i<slot.size();++i)
    {
        delete slot[i];
        cout << "Object " << i << " deleted" <<endl;
    }
    slot.clear();
}

};

int main()
{
Container bag;
Container bag2;
Base* thing=&bag2;

bag.Add(thing);

bag.Delte_All();

return 0;
}

1 个答案:

答案 0 :(得分:1)

  • 第一个案例中智能指针(例如,shared_ptr)没问题 仅供参考,当您致电make_shared<Item>(thing)时,会在堆上复制thing

  • 关于你的第二个案例(带有原始指针), bag2是堆栈中的对象, 并且您无法删除堆栈上分配的任何对象。 (*)