我想知道如果我使用智能指针来处理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;
}
答案 0 :(得分:1)
第一个案例中智能指针(例如,shared_ptr
)没问题
仅供参考,当您致电make_shared<Item>(thing)
时,会在堆上复制thing
。
关于你的第二个案例(带有原始指针),
bag2
是堆栈中的对象,
并且您无法删除堆栈上分配的任何对象。 (*)