← Back to list

Why do we need Smart Pointers?

Hello friends! Over the course of conducting many interviews, I’ve asked one particular question: Why do we need Smart Pointers in C++…

Saurabh Rajvaidya · 2025-07-01 07:33 · 6 claps · 2.6 min read
#smart-pointer #why #raii #cplusplus #c-plus-plus-language
Open on Medium ↗

Why do we need Smart Pointers?

Photo by Markus Winkler on Unsplash

Photo by Markus Winkler on Unsplash

Hello friends! Over the course of conducting many interviews, I’ve asked one particular question: Why do we need Smart Pointers in C++? Surprisingly, I rarely get a clear or satisfactory answer. So, I decided to write about it to shed some light on this important topic.

As most C++ developers know, manual memory management is often part of our job. We typically allocate memory on the heap using the new or new[]operator and are responsible for releasing it using the delete or delete[]operator once we're done.

However, there are situations where developers —unintentionally — can make mistakes. Forgetting to free memory, accidentally deleting the same pointer twice, or leaking memory when exceptions that are thrown are just a few examples of what can go wrong.

To demonstrate, let’s look at a simple example. I’ve created a basic class called Object, which includes a constructor and destructor. These special functions print messages to indicate when an object is created or destroyed, helping us visualize the object’s lifecycle within different scopes.

[embed]

Scenario-1: Memory leak

In createManagedObject() function and at line 35, we create a new object on the heap, but we never call or forgot to call deleteat line 42. This causes a memory leak. In large projects, these forgotten deletes pile up and can cause your application to consume unnecessary memory.

Scenario-2: Array Memory leak

In the createManagedObjectArray() function, at line 48, we allocate an array using new[]. If we forget to deallocate it with delete[] at line 58, it causes a memory leak for the entire array. Moreover, if we mistakenly use delete instead of delete[], only the destructor of the first object in the array will be called, leaving the remaining objects undeleted—also resulting in a memory leak.

Scenario-3: Exception Safety

In the tryCatchManagedObject() function, at line 66, we allocate memory, but if an exception is thrown, at line 71 before we call delete, the pointer is never cleaned up. This is one of the biggest reasons smart pointers are recommended — they are exception-safe. Smart pointers in C++ are exception-safe because they automatically manage the lifetime of dynamically allocated memory using RAII (Resource Acquisition Is Initialization). You bind a resource’s lifetime to the lifetime of an object, and the resource is automatically released when the object goes out of scope.

Scenario-4: Double delete

In the doubleDeleteManagedObject() function at line 100, delete is called twice on the same pointer. This results in undefined behavior, which can potentially crash the program or lead to memory corruption.

The Solution: Smart Pointers

So how do we solve all these problems? With smart pointers — specifically std::unique_ptr, std::shared_ptr, and std::weak_ptr.

Benefits of Smart Pointers:

  1. Automatic memory management — They automatically deallocate memory when the object goes out of scope. This eliminates the need for manual delete, reducing the risk of memory leaks
  2. Elimination of double deletion — Unlike raw pointers, smart pointers prevent issues like double deletion. For example, once a std::unique_ptr releases memory, it sets the internal pointer to nullptr, preventing accidental reuse
  3. Exception-safety — They provide exception-safety using RAII principle, which ensures that resources are released properly — even when exceptions are thrown
  4. Clear ownership semantics — They clearly define ownership: unique_ptr for exclusive ownership, shared_ptr for shared ownership, and weak_ptr for non-owning references—helping prevent ownership-related bugs.
  5. Cleaner, safer code and more readable code — They reduce boilerplate code and make the logic easier to follow, especially in functions with multiple return paths or early exits.

“Once you stop learning, you start dying — and so does your potential.”Albert Einstein

Feel free to share your feedback- your suggestions will help me improve both this blog and its content.


메타데이터
post_id
a570ef6ccc22
slug
why-do-we-need-smart-pointers-a570ef6ccc22
url
https://medium.com/@saurabh.professionalwork/why-do-we-need-smart-pointers-a570ef6ccc22
canonical_url
https://medium.com/@saurabh.professionalwork/why-do-we-need-smart-pointers-a570ef6ccc22
author_url
https://medium.com/@saurabh.professionalwork
status
ok
fetched_at
2026-07-19 05:05:33