std::shared_ptr
有一个漂亮的模板化构造函数,它自动为其给定类型创建正确的删除器(该链接中的构造器#2)。有没有一种方便的方法让unique_ptr自动创建一个像shared_ptr这样的删除器?
直到刚才,我(错误地)认为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'的deleter属于它的类型。如果你创建了一个'std :: unique_ptr'的向量,那么它们都将使用'std :: default_delete '。 –
2014-10-05 05:01:34
http://stackoverflow.com/questions/6829576/why-does-unique-ptr-have-the-deleter-as-a-type-parameter-while-shared-ptr-doesn – 2014-10-05 05:05:51
我认为问题出在你的身上类,而不是'std :: unique_ptr'。你的析构函数需要是虚拟的。 – Galik 2014-10-05 05:55:38