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