std::shared_ptr
hat einen raffinierten Template-Konstruktor, der automatisch den richtigen Deleter für seinen gegebenen Typ erzeugt (Konstruktor # 2 in diesem Link).Gibt es eine bequeme Möglichkeit, unique_ptr automatisch zu einem Deleter wie shared_ptr zu bekommen?
Bis gerade jetzt, ich (fälschlicherweise) dachte std::unique_ptr
ein ähnliches Konstruktor hatte, aber als ich lief den folgenden Code:
#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.
Was ist eine saubere, einfache und korrekte Art und Weise zu erstellen a, die den richtigen Deleter für den angegebenen Zeiger hat? Vor allem, wenn ich eine ganze Liste von diesen speichern möchte (d. H. std::vector<std::unique_ptr<Foo>>
), was bedeutet, dass sie alle einen heterogenen Typ haben müssen?
(verzeihen Sie den schlechten Titel, fühlen sich frei, einen besseren vorzuschlagen)
'deleter 'unique_ptr' ist in seinem Typ. Wenn Sie einen Vektor von 'std :: unique_ptr' erstellen, dann werden alle 'std :: default_delete ' verwenden. –
http://stackoverflow.com/questions/6829576/why-does-unique-ptr-have-the-deleter-as-a-type-parameter-while-shared-ptr-doesn –
Ich denke, das Problem ist mit Ihrem Klasse, nicht 'std :: unique_ptr'. Ihr Destruktor muss virtuell sein. – Galik