Owning vs Non-owning Pointer

Owning Pointer

If we create an object on the heap by using 'new', eventually we have to delete it using 'delete'. Multiple pointers can point to this object, but delete should be done once. 

The pointer that you use to perform delete is known as the owning pointer while every other pointer to that object is known as a non-owning pointer.

Click here to debug.

#include <iostream>

int main()
{
    int* ptr = new int; // Owning Raw Pointer
    *ptr = 50;

    int* ptr2 = ptr; // Non-owning Raw Pointer
    int* ptr3 = ptr; // Non-owning Raw pointer 
    
    std::cout << "Ptr's addr : " << ptr << " Ptr2's addr : " << ptr2 
         << " Ptr3's addr : " << ptr3 << std::endl; 
    std::cout << "Ptr's value : " << *ptr << " Ptr2's value : " << *ptr2 
         << " Ptr3's value : " << *ptr3 << std::endl; 

    delete ptr;
    std::cout << "\n\nAfter delete\nPtr's addr : " << ptr << " Ptr2's addr : " << ptr2 
         << " Ptr3's addr : " << ptr3 << std::endl; 
    std::cout << "Ptr's value : " << *ptr << " Ptr2's value : " << *ptr2 
         << " Ptr3's value : " << *ptr3 << std::endl; 
    return 0;

Output:

1
2
3
4
5
6
7
Ptr's addr : 0x9697438 Ptr2's addr : 0x9697438 Ptr3's addr : 0x9697438
Ptr's value : 50 Ptr2's value : 50 Ptr3's value : 50


After delete
Ptr's addr : 0x9697438 Ptr2's addr : 0x9697438 Ptr3's addr : 0x9697438
Ptr's value : -1785358955 Ptr2's value : -1785358955 Ptr3's value : -1785358955

Non-owning Pointer

int var; 
int* ptr = &var;

Here, the ptr pointer refers to the var but doesn't own any memory. Pointer 'ptr' is also not responsible for allocation and deallocation, so it is called non-owning pointer. 

Program 1

#include <iostream>

void print( int* i) { 
   std::cout << *i; 
   return;
}

int main()
{
   int var = 5;
   print(&var);
   delete var;
return 0; }

Program 2

#include <iostream>

void print( int* i) { 
   std::cout << *i; 
   return;
}

int main()
{
   int *var = new int;
   *var = 5;
   print(var);
   delete var;
   return 0;
}

Output:

1
5

In both the above program, i in function print is non-owning pointer. 

Note: It is always better to have containers and smart pointers instead of raw owning pointers. 

Reference

ModernesCPP

Reddit post 1








Comments