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?
To write exception safe code, you must know first what level of exception safety each instruction you write is. For example, a new can throw an exception, but assigning a built-in (e.g. an int, or a pointer) won't fail. A swap will never fail (don't ever write a throwing swap), a std::list::push_back can throw...
The smart pointer has an internal counter which is decreased each time that a std::shared_ptr , pointing to the same resource, goes out of scope – this technique is called reference counting. When the last shared pointer is destroyed, the counter goes to zero, and the memory is deallocated.
The initialization of a parameter, including every associated value computation and side effect, is indeterminately sequenced with respect to that of any other parameter. Here indeterminately sequenced means that one is sequenced before another, but it is not specified which. Which means it is now exception safe.
this function is deprecated as of C++17 because use_count is only an approximation in multi-threaded environment.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With