Non utilizzare puntatori prime, utilizzare std::unique_ptr
come questo:
std::vector<std::unique_ptr<Fruit>> m_fruits;
E come non si può copiare costruire un std::unique_ptr
è necessario utilizzare emplace_back
(anche se è possibile utilizzare push_back
con std::move
).
m_fruits.emplace_back(new Pear());
m_fruits.emplace_back(new Tomato());
Edit:
Come sembra che utilizzando std::vector<std::unique_ptr<T>>::emplace_back
e new
può fuoriuscire se le std::vector
esigenze e non riesce a riallocare la memoria, il mio approccio raccomandato (fino al C++ 14 introduce std::make_unique
) è quello di utilizzare push_back
come questo:
m_fruits.push_back(std::unique_ptr<Fruit>(new Pear));
m_fruits.push_back(std::unique_ptr<Fruit>(new Tomato));
Oppure usando std::make_unique
:
m_fruits.push_back(std::make_unique<Pear>());
m_fruits.push_back(std::make_unique<Tomato>());
non si sa fino a quando non si marca/profilo –
Utilizzare 'std :: vector>' per evitare perdite di memoria, la risposta è ovvia. –
ipc
Mi rendo conto che emplace_back si costruisce da solo l'oggetto, ma nel caso dei puntatori, non ne ho idea se abbia senso. – Zhen