Hayır, ilk senaryo güvenli değil ve vector
bir istisna atarsa belleği sızdırmaz. std::unique_ptr<T>
T*
T*
T*
T*
olarak dönüştürülemez, ikinci senaryo derlenmeyecektir. Olabilse bile, bu senaryo ilkinden daha kötüdür, çünkü işaretleyiciyi vektörünüze ekleyecektir, sonra işaret edilen nesneyi hemen siler. Sarkan bir işaretçi içeren bir vektör ile bırakılacaksınız.
std::vector
türünüzün türünü değiştirmeden (bunun std::vector<MyPointer*>
olduğunu varsayalım) bu kod istisnasını güvenli hale getirmenin iki yolu vardır. Kullanılması
C++ 11:
auto ptr = std::unique_ptr<MyPointer>(new MyPointer());
vector.emplace_back(ptr.get());
ptr.release();
Veya daha ayrıntılı C++ 03 yolu:
MyPointer* ptr = new MyPointer();
try
{
vector.push_back(ptr);
}
catch (...)
{
delete ptr;
throw;
}
sonra olan en kolay yöntem sizin std::vector<MyPointer*>
türünü değiştirmek mümkün değilse
std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::unique_ptr<MyPointer>(new MyPointer()));
Veya C++ 14 ile: yukarıda Daniel Frey tarafından teklif edilenler
std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::make_unique<MyPointer>());
Std :: make_unique' adlı bir C++ 14 desteğinin kullanılabilir olduğunu veya bulunmadığını varsayalım. – chris