【发布时间】:2012-03-14 06:04:08
【问题描述】:
我正在尝试将对象保存在 stl 容器(在本例中为矢量)中,并希望容器在其销毁时销毁对象,但我不太清楚细节。
我不想这样做的一种方法是简单地使用它
vector<MyClass> myVec;
myVec.push_back(MyClass(...));
由于这里的构造函数被调用了两次(一次在上面的代码中,然后在向量中复制构造函数)和一次析构函数。
最直接的替代方法是使用指针来存储动态分配的对象,但是在向量销毁时不会调用MyClass 的析构函数。存储 auto_ptr 而不是普通指针会在 myVec.push_back(...) 处出错。
在让容器的析构函数调用元素的析构函数时,有没有办法避免第一个选项?
感谢您的回答!
编辑
考虑类似的问题;如何使用抽象基类实现拥有对象的容器。唯一指针(Boost 的 unique_ptr)没有复制构造函数,所以不能直接使用。
class A {}; // Abstract base class.
class B : public A {}; // Sub class.
...
vector<A *> vec;
vec.push_back(new B());
// At destruction of vec, destroy elements left in container.
【问题讨论】:
-
std::shared_ptr怎么样? -
您愿意使用 C++11 功能或 Boost 吗?
-
我刚开始使用 Boost (1.49.0),但 auto_ptr 是在 std(内存)中定义的。但是 boost::shared_ptr 可以工作,因为实际所有权应该由容器持有,所以由于引用计数会产生一些开销。
-
你为什么关心它是否被复制?抄袭很贵吗?
-
您是否还关心向量内部可能出现的不必要的副本,例如在调整大小或排序时?
标签: c++ memory-management stl