Search code examples
c++c++11shared-ptrresetnullptr

C++11 When clearing shared_ptr, should I use reset or set to nullptr?


I have a question about C++11 best practices. When clearing a shared_ptr, should I use the reset() function with no parameter, or should I set the shared_ptr to nullptr? For example:

std::shared_ptr<std::string> foo(new std::string("foo"));
foo.reset();
foo = nullptr;

Is there any real difference, or are there advantages/disadvantages to either approach?


Solution

  • Is there any real difference, or are there advantages/disadvantages to either approach?

    The two alternatives are absolutely equivalent, in the sense that the second form (foo = nullptr) is defined in terms of the first one. Per Paragraph 20.7.1.2.3/8-10 of the C++11 Standard:

     unique_ptr& operator=(nullptr_t) noexcept;
    

    8 Effects: reset().

    9 Postcondition: get() == nullptr

    10 Returns: *this.

    Therefore, just choose the one which makes its intent clearest for you. Personally, I prefer:

    foo = nullptr;
    

    Because it makes it more evident that we want the pointer to be null. As a general advice, however, try to minimize the situations where you need to explicitly reset a smart pointer.


    Besides, rather than using new:

    std::shared_ptr<std::string> foo(new std::string("foo"));
    

    Consider using std::make_shared() when possible:

    auto foo = std::make_shared<std::string>("foo");