What is a smart pointer and when should I use one in C++
Hey learners, In this tutorial we will learn everything about smart pointers in C++ so stay tuned.
Do we all know what is a pointer?? Pointers are just like variables that are used to store addresses. We can dynamically create a pointer using a new operator and can also deallocate it using delete. But what if you forgot to deallocate it, it can cause a memory leak.
These allocation and deallocation processes are a huge overhead for beginners because you have to do it manually.
Is there any smarter way to do that?
Yes, here the concept of a smart pointer comes into the picture. Let’s understand it in detail.
Smart pointer in C++
Smart pointers are pointers for which we don’t need to deallocate memory using delete, it can be done automatically. If we consider other languages like java etc…it has a garbage collector which can deallocate the unused memory. Similarly, in C++ we can achieve this using smart pointers.
Why use a smart pointer?? if you want to make efficient use of memory smart pointer will be a great choice for you.
Code
#include <iostream> using namespace std; class smartpointer { float* ptr1; public: smartpointer(float* p = NULL) { ptr1 = p; } ~smartpointer() { delete (ptr1); } float& operator*() { return *ptr1; } }; int main() { smartpointer ptr1(new float()); *ptr1 = 80.44; cout << *ptr1; return 0; }
Explanation
- Here we are creating a class named smartpointer. After that, we will create a float pointer named ptr1.
- Inside our class we will create a constructor, destructor and we will overload dereferencing operator.
- here we don’t need to deallocate memory using delete this can be automatically done by the destructor. At last, it will print the value.
Types of smart pointers
- Unique_ptr
- Shared_ptr
- Weak_ptr
Let’s understand each one of them.
1) Unique_ptr:- Unique pointers are those in which only one pointer can point an object at a time.
Example
- Firstly we need to include header file memory.
- we will create a class square inside that we will make a constructor and a function to calculate the area.
- Inside our main function we will create a unique_pointer and call the area function for that which will calculate the area and print it
- Remember it’s a unique pointer which means only one pointer can be used at a time so if want to make another pointer we will first remove pointer1 this can be done using the move function.
Code
#include <iostream> using namespace std; #include <memory> class Square { int side; public: Square(int s){ side=s; } int area(){ return side*side; } }; int main(){ unique_ptr<Square> Pointer1(new Square(5)); cout << Pointer1->area() << endl; unique_ptr<Square> Pointer2; Pointer2 = move(Pointer1); cout << Pointer2->area() << endl; return 0; }
2) Shared_ptr:- Shared pointers are those in which more than one pointer can point an object at the same time. Additionally, it will maintain a reference counter using the use_count method.
Example
- Firstly we need to include header file memory.
- we will create a class square inside that we will make a constructor and a function to calculate the area.
- Inside our main function we will create a shared_pointer and call the area function for that which will calculate the area and print it.
- Remember it’s a shared pointer which means more than one pointer can point an object at the same time.
- lastly we will use a method named use_count.
Code
#include <iostream> using namespace std; #include <memory> class Square { int side; public: Square(int s) { side=s; } int area() { return side*side; } }; int main() { shared_ptr<Square> Pointer1(new Square(5)); cout << Pointer1->area() << endl; shared_ptr<Square> Pointer2; Pointer2 = Pointer1; cout << Pointer2->area() << endl; cout << Pointer1.use_count() << endl; return 0; }
3)Weak_ptr:- Weak_pointer are same as shared pointer the only difference is that it will not maintain reference counter.
Example
- Firstly we need to include header file memory.
- we will create a class square inside that we will make a constructor and a function to calculate the area.
- Inside our main function we will create a shared_pointer1 and a weak_ptr.
- lastly we will use a method named use_count but it will not maintain reference count as it is a weak_ptr.
Code
#include <iostream> using namespace std; #include <memory> class Square { int side; public: Square(int s) { side=s; } int area() { return side*side; } }; int main() { shared_ptr<Square> Pointer1(new Square(5)); cout << Pointer1->area() << endl; weak_ptr<Square> Pointer2 = Pointer1; cout<< Pointer1.use_count()<<endl; return 0; }
That’ll about Smart pointers To conclude I would say Smart pointers are a great choice if you want to make efficient use of available memory.
All the 3 types of smart pointers have their importance it depends on the user’s need where he/she wants to use it.
Leave a Reply