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:
- The first one before the call to the constructor
- The second one in the constructor of shared_ptr (This is what happens in VS 2012 for example)
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?
- using make_shared
- giving the ownership of the first allocation to a std::unique_ptr then transfering the ownership
- Other thoughts ?