bob bob - 2 months ago 19
C++ Question

Deleting dynamically allocated variables setting pointer to 0

I can't understand the end of this code (

array = 0;
):

#include <iostream>

int main()
{
std::cout << "Enter a positive integer: ";
int length;
std::cin >> length;

int *array = new int[length];

std::cout << "I just allocated an array of integers of length " << length << '\n';

array[0] = 5; // set element 0 to value 5

delete[] array; // use array delete to deallocate array
array = 0; // use nullptr instead of 0 in C++11

return 0;
}


At the end, a dynamically allocated array is deleted (returned to OS) and then assigned a value of 0.

Why is this done? After array has been returned to the OS, there is no need to assign it a value of 0, right?

Code from: http://www.learncpp.com/cpp-tutorial/6-9a-dynamically-allocating-arrays/

Answer Source

After array has been returned to the OS, there is no need to assign it a value of 0, right?

You're right it is not needed because the memory is freed. But think of a case where you may use the pointer in another place in your code (functions, loops, etc.) after you use delete on it.

The array variable still holds the address of the old allocation after the delete statement was called (dangling pointer). If you would access that address you would get undefined bahaviour (UB) because the memory is no longer yours, in most of the cases your program would crash.
To avoid that you do checks like:

if (array != nullptr)
{
   /* access array */
   ...
}

To make that check possible you set the pointer to nullptr or NULL if C++11 is not available. The nullptr keyword introduces type safety because it acts like a pointer type and should be preferred over NULL. To define you own nullptr to use it for pre C++11 compiler look here: How to define our own nullptr in c++98?