Menu
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP C C++ C# AWS W3.CSS HOW TO BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS DSA TYPESCRIPT ANGULAR ANGULARJS GIT POSTGRESQL MONGODB ASP AI R GO KOTLIN SWIFT SASS VUE GEN AI SCIPY CYBERSECURITY DATA SCIENCE INTRO TO PROGRAMMING INTRO TO HTML & CSS BASH RUST TOOLS

C++ Tutorial

C++ HOME C++ Intro C++ Get Started C++ Syntax C++ Output C++ Comments C++ Variables C++ User Input C++ Data Types C++ Operators C++ Type Conversion C++ Strings C++ Math C++ Booleans C++ If...Else C++ Switch C++ While Loop C++ For Loop C++ Break/Continue C++ Arrays C++ Structures C++ Enums C++ References C++ Pointers C++ Memory Mgmt

C++ Functions

C++ Functions C++ Function Parameters C++ Function Overloading C++ Scope C++ Recursion C++ Lambda

C++ Classes

C++ OOP C++ Classes/Objects C++ Class Methods C++ Constructors C++ Destructors C++ The this Pointer C++ Access Specifiers C++ Encapsulation C++ Friend Functions C++ Inheritance C++ Polymorphism C++ Operator Overload C++ Templates

C++ Files

C++ Files

C++ Date

C++ Date

C++ Errors

C++ Errors C++ Debugging C++ Exceptions C++ Input Validation

C++ Problem Solving

C++ Problem Solving C++ Build the Logic C++ Test Cases

C++ Data Structures

C++ Data Structures & STL C++ Vectors C++ List C++ Stacks C++ Queues C++ Deque C++ Sets C++ Maps C++ Unordered Map C++ Unordered Set C++ Iterators C++ Algorithms

C++ Namespaces

C++ Namespaces

C++ Projects

C++ Projects

C++ Cert

C++ Certificate

C++ How To

C++ How Tos

C++ Examples

C++ Examples C++ Real-Life Examples C++ Compiler C++ Exercises C++ Quiz C++ Code Challenges C++ Practice Problems C++ Syllabus C++ Study Plan

C++ Reference

C++ Reference C++ Keywords C++ <algorithm> C++ <cctype> C++ <cmath> C++ <cstdlib> C++ <cstring> C++ <ctime> C++ <deque> C++ <fstream> C++ <iomanip> C++ <iostream> C++ <list> C++ <map> C++ <memory> C++ <queue> C++ <random> C++ <set> C++ <sstream> C++ <stack> C++ <stdexcept> C++ <string> C++ <unordered_map> C++ <unordered_set> C++ <vector>


C++ Smart Pointers


Share

Smart Pointers

In the new and delete chapter, you learned that memory you get with new must be freed with delete. If you forget it, the memory is never given back. This is called a memory leak.

A smart pointer works like a normal pointer, but it frees the memory automatically when it is no longer used. To use smart pointers, include the <memory> library:

// Include the memory library
#include <memory>

The two most common smart pointers are unique_ptr and shared_ptr.


unique_ptr

A unique_ptr is the only owner of its memory. The memory is freed when the unique_ptr goes out of scope, for example when the function ends:

Example

unique_ptr<int> ptr(new int(25));

cout << *ptr;

Try it Yourself »

You use * to get the value, just like with a normal pointer. But there is no delete. The memory is freed automatically when main() ends.

Note: Since C++14, you can also write make_unique<int>(25) instead of new int(25). It does the same, and you never have to write new at all.

Because a unique_ptr is the only owner, you cannot copy it:

Example

unique_ptr<int> ptr1(new int(25));
unique_ptr<int> ptr2 = ptr1;  // Error: only one owner is allowed


shared_ptr

Unlike a unique_ptr, many shared_ptr variables can point to the same memory.

C++ keeps count of how many there are, and only frees the memory when the last one goes out of scope.

To create a shared_ptr, use the make_shared function.

In the example below, make_shared<int>(10) creates an int with the value 10, and gives you a shared_ptr that points to it:

Example

shared_ptr<int> ptr1 = make_shared<int>(10);
shared_ptr<int> ptr2 = ptr1;

cout << *ptr1 << "\n";
cout << *ptr2 << "\n";
cout << ptr1.use_count();

Try it Yourself »

use_count() returns the number of owners. Both ptr1 and ptr2 point to the same value, so the count is 2.


Which One Should You Use?

  • Use unique_ptr by default. It is simple and fast.
  • Use shared_ptr when several parts of your program need the same object.

In both cases, you do not need delete.



Free account

Track your progress

XP earned 0 Day streak 0 Spaces 0 League —

New

Learn in Adventure Mode W3Schools Adventure App

Coding fundamentals as bite-sized lessons and challenges.

×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
sales@w3schools.com

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
help@w3schools.com

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookies and privacy policy.

Copyright 1999-2026 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.