【发布时间】:2014-10-05 04:55:59
【问题描述】:
std::shared_ptr 有一个漂亮的模板化构造函数,它会自动为其给定类型创建正确的删除器(该链接中的构造函数 #2)。
直到刚才,我(错误地)认为std::unique_ptr 有一个类似的构造函数,但是当我运行以下代码时:
#include <memory>
#include <iostream>
// Notice nothing is virtual
struct Foo
{
~Foo() { std::cout << "Foo\n"; }
};
struct Bar : public Foo
{
~Bar() { std::cout << "Bar\n"; }
};
int main()
{
{
std::cout << "shared_ptr:\n";
std::shared_ptr<Foo> p(new Bar()); // prints Bar Foo
}
{
std::cout << "unique_ptr:\n";
std::unique_ptr<Foo> p(new Bar()); // prints Foo
}
}
I was surprised to learn that unique_ptr doesn't call Bar's destructor.
创建一个unique_ptr 并为其给定指针具有正确的删除器的干净、简单和正确的方法是什么?特别是如果我想存储这些的完整列表(即std::vector<std::unique_ptr<Foo>>),这意味着它们都必须具有异构类型?
(请原谅这个糟糕的标题;欢迎提出更好的标题)
【问题讨论】:
-
unique_ptr的删除器在它的类型中。如果你做一个std::unique_ptr<Foo>的向量,那么他们都将使用std::default_delete<Foo>。 -
我认为问题出在你的班级,而不是
std::unique_ptr。你的析构函数必须是虚拟的。
标签: c++