nicht roh Zeiger Verwenden Sie dieses std::unique_ptr
wie verwenden:
std::vector<std::unique_ptr<Fruit>> m_fruits;
Und wie Sie kein std::unique_ptr
konstruieren kopieren können Sie verwenden, muss emplace_back
(obwohl Sie push_back
mit std::move
verwenden können).
m_fruits.emplace_back(new Pear());
m_fruits.emplace_back(new Tomato());
Edit:
Wie es scheint, dass std::vector<std::unique_ptr<T>>::emplace_back
und new
zu verwenden, wenn der std::vector
Bedarf austreten kann und versagt Speicher neu zuzuordnen, mein empfohlene Ansatz (bis C++ 14 führt std::make_unique
) ist zu verwenden push_back
wie folgt:
m_fruits.push_back(std::unique_ptr<Fruit>(new Pear));
m_fruits.push_back(std::unique_ptr<Fruit>(new Tomato));
Oder mit std::make_unique
:
m_fruits.push_back(std::make_unique<Pear>());
m_fruits.push_back(std::make_unique<Tomato>());
Sie werden nicht wissen, bis Sie Benchmark/Profil –
es Verwenden 'std :: vector>' um Speicherlecks zu vermeiden, ist die Antwort offensichtlich. –
ipc
Ich Leser, der emplace_back baut sich das Objekt, aber im Falle von Zeigern habe ich keine Ahnung, ob Sinn haben. – Zhen