I just realised reading this page that the constructor of std::shared_ptr
with a single pointer argument is not noexcept.
Hence the following code contains a possible memory leak:
std::shared_ptr<int> p3 (new int);
The reasonning is that two allocations could occure:
Two questions here:
Is it true that if the second allocation throws an exception, the memory of the first one leaks ?
If the answer is yes:
what is the correct idiom to use std::shared_ptr?
template<class Y> explicit shared_ptr(Y* p);
[util.smartptr.shared.const]/6 Throws:
bad_alloc
, or an implementation-defined exception when a resource other than memory could not be obtained.
[util.smartptr.shared.const]/7 Exception safety: If an exception is thrown,delete p
is called.
So no, no memory leak.