By Alex Reynolds

2008-09-20 00:09:24 8 Comments

What is a smart pointer and when should I use one?


@einpoklum 2015-05-09 19:06:44

Here's a simple answer for these days of modern C++ (C++11 and later):

  • What is a smart pointer?
    It's a type whose values can be used like pointers, but which provides the additional feature of automatic memory management: When a smart pointer is no longer in use, the memory it points to is deallocated (see also the more detailed definition on Wikipedia).
  • When should I use one?
    In code which involves tracking the ownership of a piece of memory, allocating or de-allocating; the smart pointer often saves you the need to do these things explicitly.
  • But which smart pointer should I use in which of those cases?
    • Use std::unique_ptr when you don't intend to hold multiple references to the same object. For example, use it for a pointer to memory which gets allocated on entering some scope and de-allocated on exiting the scope.
    • Use std::shared_ptr when you do want to refer to your object from multiple places - and do not want your object to be de-allocated until all these references are themselves gone.
    • Use std::weak_ptr when you do want to refer to your object from multiple places - for those references for which it's ok to ignore and deallocate (so they'll just note the object is gone when you try to dereference).
    • Don't use the boost:: smart pointers or std::auto_ptr except in special cases which you can read up on if you must.
  • Hey, I didn't ask which one to use!
    Ah, but you really wanted to, admit it.
  • So when should I use regular pointers then?
    Mostly in code that is oblivious to memory ownership. This would typically be in functions which get a pointer from someplace else and do not allocate nor de-allocate, and do not store a copy of the pointer which outlasts their execution.

@wiktor.wandachowicz 2016-11-13 23:22:55

It is worth noting that while smart (owning) pointers help with proper memory management, raw (non-owning) pointers are still useful for other organizational purposes in data structures. Herb Sutter gave a great presentation upon this matter at CppCon 2016, that you can see on YouTube: Leak-Freedom in C++... By Default.

@Caleth 2019-09-17 12:50:28

@wiktor.wandachowicz T* is to std::unique_ptr<T> what std::weak_ptr<T> is to std::shared_ptr<T>

@einpoklum 2019-09-17 14:27:11

@Caleth: No, I wouldn't say that.

@einpoklum 2020-01-22 12:15:54

@TonyTannous: With respect - It was a major edit; and I don't feel my answer, which is abstract, needs it. I suggest you make the example a separate answer, on link to it in a comment.

@Lloyd 2008-09-20 00:48:23


This answer is rather old, and so describes what was 'good' at the time, which was smart pointers provided by the Boost library. Since C++11, the standard library has provided sufficient smart pointers types, and so you should favour the use of std::unique_ptr, std::shared_ptr and std::weak_ptr.

There was also std::auto_ptr. It was very much like a scoped pointer, except that it also had the "special" dangerous ability to be copied — which also unexpectedly transfers ownership.
It was deprecated in C++11 and removed in C++17, so you shouldn't use it.

std::auto_ptr<MyObject> p1 (new MyObject());
std::auto_ptr<MyObject> p2 = p1; // Copy and transfer ownership. 
                                 // p1 gets set to empty!
p2->DoSomething(); // Works.
p1->DoSomething(); // Oh oh. Hopefully raises some NULL pointer exception.


A smart pointer is a class that wraps a 'raw' (or 'bare') C++ pointer, to manage the lifetime of the object being pointed to. There is no single smart pointer type, but all of them try to abstract a raw pointer in a practical way.

Smart pointers should be preferred over raw pointers. If you feel you need to use pointers (first consider if you really do), you would normally want to use a smart pointer as this can alleviate many of the problems with raw pointers, mainly forgetting to delete the object and leaking memory.

With raw pointers, the programmer has to explicitly destroy the object when it is no longer useful.

// Need to create the object to achieve some goal
MyObject* ptr = new MyObject(); 
ptr->DoSomething(); // Use the object in some way
delete ptr; // Destroy the object. Done with it.
// Wait, what if DoSomething() raises an exception...?

A smart pointer by comparison defines a policy as to when the object is destroyed. You still have to create the object, but you no longer have to worry about destroying it.

SomeSmartPtr<MyObject> ptr(new MyObject());
ptr->DoSomething(); // Use the object in some way.

// Destruction of the object happens, depending 
// on the policy the smart pointer class uses.

// Destruction would happen even if DoSomething() 
// raises an exception

The simplest policy in use involves the scope of the smart pointer wrapper object, such as implemented by boost::scoped_ptr or std::unique_ptr.

void f()
       std::unique_ptr<MyObject> ptr(new MyObject());
    } // ptr goes out of scope -- 
      // the MyObject is automatically destroyed.

    // ptr->Oops(); // Compile error: "ptr" not defined
                    // since it is no longer in scope.

Note that std::unique_ptr instances cannot be copied. This prevents the pointer from being deleted multiple times (incorrectly). You can, however, pass references to it around to other functions you call.

std::unique_ptrs are useful when you want to tie the lifetime of the object to a particular block of code, or if you embedded it as member data inside another object, the lifetime of that other object. The object exists until the containing block of code is exited, or until the containing object is itself destroyed.

A more complex smart pointer policy involves reference counting the pointer. This does allow the pointer to be copied. When the last "reference" to the object is destroyed, the object is deleted. This policy is implemented by boost::shared_ptr and std::shared_ptr.

void f()
    typedef std::shared_ptr<MyObject> MyObjectPtr; // nice short alias
    MyObjectPtr p1; // Empty

        MyObjectPtr p2(new MyObject());
        // There is now one "reference" to the created object
        p1 = p2; // Copy the pointer.
        // There are now two references to the object.
    } // p2 is destroyed, leaving one reference to the object.
} // p1 is destroyed, leaving a reference count of zero. 
  // The object is deleted.

Reference counted pointers are very useful when the lifetime of your object is much more complicated, and is not tied directly to a particular section of code or to another object.

There is one drawback to reference counted pointers — the possibility of creating a dangling reference:

// Create the smart pointer on the heap
MyObjectPtr* pp = new MyObjectPtr(new MyObject())
// Hmm, we forgot to destroy the smart pointer,
// because of that, the object is never destroyed!

Another possibility is creating circular references:

struct Owner {
   std::shared_ptr<Owner> other;

std::shared_ptr<Owner> p1 (new Owner());
std::shared_ptr<Owner> p2 (new Owner());
p1->other = p2; // p1 references p2
p2->other = p1; // p2 references p1

// Oops, the reference count of of p1 and p2 never goes to zero!
// The objects are never destroyed!

To work around this problem, both Boost and C++11 have defined a weak_ptr to define a weak (uncounted) reference to a shared_ptr.

@Mateen Ulhaq 2011-07-16 23:06:45

Do you mean std::auto_ptr<MyObject> p1 (new MyObject()); instead of std::auto_ptr<MyObject> p1 (new Owner());?

@galymzhan 2012-05-08 07:39:28

Where does tr1 namespace come from? Is it in standard library?

@errah 2012-06-12 21:22:00

Perhaps a nitpick on an otherwise amazing comment, but it would be great if this included something about the memory and CPU overhead caused by a smart pointer; just so it can truely be said to include all information

@SaulBack 2012-09-11 20:50:06

Awesome answer. It would be nice if it were updated for c++11. I found this answer looking for info about the new 11 standard and it would be nice if future visitors could find the updated info. I know auto_ptr has been deprecated. I believe shated_ptr and weak_ptr exist as described, and I think the scoped_ptr is now unique_ptr in the standard. If this is true, can this answer be updated please?

@metal 2013-03-19 16:33:43

There's no such thing as std::tr1::scoped_ptr, only boost::scoped_ptr.

@mbadawi23 2013-09-15 17:14:12

Would you elaborate more on the subject of weak_ptr and how it would solve the circular reference issue?

@Michael Dorst 2014-08-13 21:59:06

To say that the possibility of creating a dangling reference is a drawback to reference counted pointers is absolutely insane. Possible dangling references are a drawback of any C++ pointer. In fact, it is exactly that drawback which smart pointers are intended to alleviate.

@Michael Dorst 2014-08-13 22:02:09

If you declare a pointer to a smart pointer (as was done in the example) you knowingly give up all benefits of the smart pointer. This is not a drawback or a design flaw, it is the most idiotic usage imaginable.

@Toby Speight 2015-09-17 11:55:31

A const std::auto_ptr is safe to use, if you're stuck with C++03. I used it for pimpl pattern quite a lot until I got access to C++11.

@plugwash 2015-10-21 00:34:12

"mainly forgetting to delete the object and leaking memory." or worse deleting it too early and corrupting random memory and causing a crash or wrong results in a totall unrelated piece of code..

@Rohit Rawat 2017-02-09 06:38:45

@Lloyd in the third last code snippet(titled "There is one drawback to reference counted pointers — the possibility of creating a dangling reference:"). What if I make shared pointer to a shared pointer? .ie. std::shared_ptr<MyObjectPtr> pp won't that solve the problem of dangling pointer if I forget to delete pp?

@xaxxon 2017-07-24 01:00:13

"Smart pointers should be preferred over raw pointers." This simply isn't universally true. Smart pointers should be preferred for ownership. Passing a raw pointer around for use when it can be null (and therefor a reference isn't appropriate) is fine.

@Gabriel Staples 2017-12-21 20:06:41

Note that C++14 now has std::make_unique ( to make a std::unique_ptr ( instead of doing it explicitly.

@curiousguy 2019-11-14 16:20:42

"Smart pointers should be preferred over raw pointers" Does that imply that member functions should be abandoned?

@Gabriel Staples 2020-02-26 19:32:18

The case of auto-deleting when the unique pointer to an object goes out of scope begs the question: why not just use the stack? Instead of std::unique_ptr<MyObject> ptr(new MyObject()); inside a scoped block, just do MyObject() myobj; inside the scoped block and be done! When myobj goes out of scope, it is automatically deleted from the stack! So, why dynamically allocate on the heap at all here? Please discuss this in your answer.

@Gabriel Staples 2020-02-26 19:44:08

Question I just asked, regarding my comment above:…

@NAND 2020-05-14 23:04:22

std::unique_ptr is in <memory> header file. +1 if you were looking for that :D

@da77a 2018-01-26 03:10:57

The existing answers are good but don't cover what to do when a smart pointer is not the (complete) answer to the problem you are trying to solve.

Among other things (explained well in other answers) using a smart pointer is a possible solution to How do we use a abstract class as a function return type? which has been marked as a duplicate of this question. However, the first question to ask if tempted to specify an abstract (or in fact, any) base class as a return type in C++ is "what do you really mean?". There is a good discussion (with further references) of idiomatic object oriented programming in C++ (and how this is different to other languages) in the documentation of the boost pointer container library. In summary, in C++ you have to think about ownership. Which smart pointers help you with, but are not the only solution, or always a complete solution (they don't give you polymorphic copy) and are not always a solution you want to expose in your interface (and a function return sounds an awful lot like an interface). It might be sufficient to return a reference, for example. But in all of these cases (smart pointer, pointer container or simply returning a reference) you have changed the return from a value to some form of reference. If you really needed copy you may need to add more boilerplate "idiom" or move beyond idiomatic (or otherwise) OOP in C++ to more generic polymorphism using libraries like Adobe Poly or Boost.TypeErasure.

@Trombe 2017-06-12 23:23:27

A smart pointer is a class, a wrapper of a normal pointer. Unlike normal pointers, smart point’s life circle is based on a reference count (how many time the smart pointer object is assigned). So whenever a smart pointer is assigned to another one, the internal reference count plus plus. And whenever the object goes out of scope, the reference count minus minus.

Automatic pointer, though looks similar, is totally different from smart pointer. It is a convenient class that deallocates the resource whenever an automatic pointer object goes out of variable scope. To some extent, it makes a pointer (to dynamically allocated memory) works similar to a stack variable (statically allocated in compiling time).

@Sridhar Iyer 2008-09-20 01:53:30

Definitions provided by Chris, Sergdev and Llyod are correct. I prefer a simpler definition though, just to keep my life simple: A smart pointer is simply a class that overloads the -> and * operators. Which means that your object semantically looks like a pointer but you can make it do way cooler things, including reference counting, automatic destruction etc. shared_ptr and auto_ptr are sufficient in most cases, but come along with their own set of small idiosyncrasies.

@Daksh 2016-11-07 04:07:54

Smart Pointers are those where you don't have to worry about Memory De-Allocation, Resource Sharing and Transfer.

You can very well use these pointer in the similar way as any allocation works in Java. In java Garbage Collector does the trick, while in Smart Pointers, the trick is done by Destructors.

@sergtk 2008-09-20 00:32:49

Smart pointer is a pointer-like type with some additional functionality, e.g. automatic memory deallocation, reference counting etc.

Small intro is available on page Smart Pointers - What, Why, Which?.

One of the simple smart-pointer type is std::auto_ptr (chapter 20.4.5 of C++ standard), which allows to deallocate memory automatically when it out of scope and which is more robust than simple pointer usage when exceptions are thrown, although less flexible.

Another convenient type is boost::shared_ptr which implements reference counting and automatically deallocates memory when no references to object remains. This helps avoiding memory leaks and is easy to use to implement RAII.

Subject is covered in depth in book "C++ Templates: The Complete Guide" by David Vandevoorde, Nicolai M. Josuttis, chapter Chapter 20. Smart Pointers. Some topics covered:

@ninMonkey 2019-06-12 13:38:20

Warning std::auto_ptr is deprecated and highly discourage as you can accidentally transfer ownership. -- C++11 removes the need of Boost, use: std::unique_ptr, std::shared_ptr and std::weak_ptr

@nnrales 2016-03-03 00:58:48

Let T be a class in this tutorial Pointers in C++ can be divided into 3 types :

1) Raw pointers :

T a;  
T * _ptr = &a; 

They hold a memory address to a location in memory. Use with caution , as programs become complex hard to keep track.

Pointers with const data or address { Read backwards }

T a ; 
const T * ptr1 = &a ; 
T const * ptr1 = &a ;

Pointer to a data type T which is a const. Meaning you cannot change the data type using the pointer. ie *ptr1 = 19 ; will not work. But you can move the pointer. ie ptr1++ , ptr1-- ; etc will work. Read backwards : pointer to type T which is const

  T * const ptr2 ;

A const pointer to a data type T . Meaning you cannot move the pointer but you can change the value pointed to by the pointer. ie *ptr2 = 19 will work but ptr2++ ; ptr2-- etc will not work. Read backwards : const pointer to a type T

const T * const ptr3 ; 

A const pointer to a const data type T . Meaning you cannot either move the pointer nor can you change the data type pointer to be the pointer. ie . ptr3-- ; ptr3++ ; *ptr3 = 19; will not work

3) Smart Pointers : { #include <memory> }

Shared Pointer:

  T a ; 
     //shared_ptr<T> shptr(new T) ; not recommended but works 
     shared_ptr<T> shptr = make_shared<T>(); // faster + exception safe

     std::cout << shptr.use_count() ; // 1 //  gives the number of " 
things " pointing to it. 
     T * temp = shptr.get(); // gives a pointer to object

     // shared_pointer used like a regular pointer to call member functions

     shptr.reset() ; // frees the object pointed to be the ptr 
     shptr = nullptr ; // frees the object 
     shptr = make_shared<T>() ; // frees the original object and points to new object

Implemented using reference counting to keep track of how many " things " point to the object pointed to by the pointer. When this count goes to 0 , the object is automatically deleted , ie objected is deleted when all the share_ptr pointing to the object goes out of scope. This gets rid of the headache of having to delete objects which you have allocated using new.

Weak Pointer : Helps deal with cyclic reference which arises when using Shared Pointer If you have two objects pointed to by two shared pointers and there is an internal shared pointer pointing to each others shared pointer then there will be a cyclic reference and the object will not be deleted when shared pointers go out of scope. To solve this , change the internal member from a shared_ptr to weak_ptr. Note : To access the element pointed to by a weak pointer use lock() , this returns a weak_ptr.

T a ; 
shared_ptr<T> shr = make_shared<T>() ; 
weak_ptr<T> wk = shr ; // initialize a weak_ptr from a shared_ptr 
wk.lock()->memFn() ; // use lock to get a shared_ptr 
//   ^^^ Can lead to exception if the shared ptr has gone out of scope
if(!wk.expired()) wk.lock()->memFn() ;
// Check if shared ptr has gone out of scope before access

See : When is std::weak_ptr useful?

Unique Pointer : Light weight smart pointer with exclusive ownership. Use when pointer points to unique objects without sharing the objects between the pointers.

unique_ptr<T> uptr(new T);

//T * ptr = uptr.release(); // uptr becomes null and object is pointed to by ptr
uptr.reset() ; // deletes the object pointed to by uptr 

To change the object pointed to by the unique ptr , use move semantics

unique_ptr<T> uptr1(new T);
unique_ptr<T> uptr2(new T);
uptr2 = std::move(uptr1); 
// object pointed by uptr2 is deleted and 
// object pointed by uptr1 is pointed to by uptr2
// uptr1 becomes null 

References : They can essentially be though of as const pointers, ie a pointer which is const and cannot be moved with better syntax.

See : What are the differences between a pointer variable and a reference variable in C++?

r-value reference : reference to a temporary object   
l-value reference : reference to an object whose address can be obtained
const reference : reference to a data type which is const and cannot be modified 

Reference : Thanks to Andre for pointing out this question.

@Santosh 2014-03-07 09:03:03

Here is the Link for similar answers :

A smart pointer is an object that acts, looks and feels like a normal pointer but offers more functionality. In C++, smart pointers are implemented as template classes that encapsulate a pointer and override standard pointer operators. They have a number of advantages over regular pointers. They are guaranteed to be initialized as either null pointers or pointers to a heap object. Indirection through a null pointer is checked. No delete is ever necessary. Objects are automatically freed when the last pointer to them has gone away. One significant problem with these smart pointers is that unlike regular pointers, they don't respect inheritance. Smart pointers are unattractive for polymorphic code. Given below is an example for the implementation of smart pointers.


template <class X>
class smart_pointer
               smart_pointer();                          // makes a null pointer
               smart_pointer(const X& x)            // makes pointer to copy of x

               X& operator *( );
               const X& operator*( ) const;
               X* operator->() const;

               smart_pointer(const smart_pointer <X> &);
               const smart_pointer <X> & operator =(const smart_pointer<X>&);

This class implement a smart pointer to an object of type X. The object itself is located on the heap. Here is how to use it:

smart_pointer <employee> p= employee("Harris",1333);

Like other overloaded operators, p will behave like a regular pointer,


@Saqlain 2013-03-12 09:51:18

A smart pointer is an object that acts like a pointer, but additionally provides control on construction, destruction, copying, moving and dereferencing.

One can implement one's own smart pointer, but many libraries also provide smart pointer implementations each with different advantages and drawbacks.

For example, Boost provides the following smart pointer implementations:

  • shared_ptr<T> is a pointer to T using a reference count to determine when the object is no longer needed.
  • scoped_ptr<T> is a pointer automatically deleted when it goes out of scope. No assignment is possible.
  • intrusive_ptr<T> is another reference counting pointer. It provides better performance than shared_ptr, but requires the type T to provide its own reference counting mechanism.
  • weak_ptr<T> is a weak pointer, working in conjunction with shared_ptr to avoid circular references.
  • shared_array<T> is like shared_ptr, but for arrays of T.
  • scoped_array<T> is like scoped_ptr, but for arrays of T.

These are just one linear descriptions of each and can be used as per need, for further detail and examples one can look at the documentation of Boost.

Additionally, the C++ standard library provides three smart pointers; std::unique_ptr for unique ownership, std::shared_ptr for shared ownership and std::weak_ptr. std::auto_ptr existed in C++03 but is now deprecated.

@einpoklum 2015-12-29 21:54:07

Please explain why scoped_ptr is not like a locally-declared const unique_ptr - which also gets deleted on exiting the scope.

@markets 2008-09-20 00:13:25

A smart pointer is like a regular (typed) pointer, like "char*", except when the pointer itself goes out of scope then what it points to is deleted as well. You can use it like you would a regular pointer, by using "->", but not if you need an actual pointer to the data. For that, you can use "&*ptr".

It is useful for:

  • Objects that must be allocated with new, but that you'd like to have the same lifetime as something on that stack. If the object is assigned to a smart pointer, then they will be deleted when the program exits that function/block.

  • Data members of classes, so that when the object is deleted all the owned data is deleted as well, without any special code in the destructor (you will need to be sure the destructor is virtual, which is almost always a good thing to do).

You may not want to use a smart pointer when:

  • ... the pointer shouldn't actually own the data... i.e., when you are just using the data, but you want it to survive the function where you are referencing it.
  • ... the smart pointer isn't itself going to be destroyed at some point. You don't want it to sit in memory that never gets destroyed (such as in an object that is dynamically allocated but won't be explicitly deleted).
  • ... two smart pointers might point to the same data. (There are, however, even smarter pointers that will handle that... that is called reference counting.)

See also:

@Chris Jester-Young 2008-09-20 00:14:52

Most kinds of smart pointers handle disposing of the pointer-to object for you. It's very handy because you don't have to think about disposing of objects manually anymore.

The most commonly-used smart pointers are std::tr1::shared_ptr (or boost::shared_ptr), and, less commonly, std::auto_ptr. I recommend regular use of shared_ptr.

shared_ptr is very versatile and deals with a large variety of disposal scenarios, including cases where objects need to be "passed across DLL boundaries" (the common nightmare case if different libcs are used between your code and the DLLs).

@Jorge Ferreira 2008-09-20 00:12:10

In computer science, a smart pointer is an abstract data type that simulates a pointer while providing additional features, such as automatic garbage collection or bounds checking. These additional features are intended to reduce bugs caused by the misuse of pointers while retaining efficiency. Smart pointers typically keep track of the objects that point to them for the purpose of memory management. The misuse of pointers is a major source of bugs: the constant allocation, deallocation and referencing that must be performed by a program written using pointers makes it very likely that some memory leaks will occur. Smart pointers try to prevent memory leaks by making the resource deallocation automatic: when the pointer to an object (or the last in a series of pointers) is destroyed, for example because it goes out of scope, the pointed object is destroyed too.

Related Questions

Sponsored Content

26 Answered Questions

25 Answered Questions

[SOLVED] What is the "-->" operator in C++?

40 Answered Questions

11 Answered Questions

[SOLVED] What does the explicit keyword mean?

9 Answered Questions

[SOLVED] What is a lambda expression in C++11?

12 Answered Questions

[SOLVED] What is move semantics?

21 Answered Questions

[SOLVED] Why should I use a pointer rather than the object itself?

5 Answered Questions

[SOLVED] What is the copy-and-swap idiom?

9 Answered Questions

8 Answered Questions

[SOLVED] What is The Rule of Three?

Sponsored Content