Martijn Courteaux
Martijn Courteaux

Reputation: 68847

C++: Question about freeing memory

On Learn C++, they wrote this to free memory:

int *pnValue = new int; // dynamically allocate an integer
*pnValue = 7; // assign 7 to this integer
delete pnValue;
pnValue = 0;

My question is: "Is the last statement needed to free the memory correctly, completly?"

I thought that the pointer *pnValue was still on the stack and new doesn't make any sense to the pointer. And if it is on the stack it will be cleaned up when the application leaves the scope (where the pointer is declared in), isn't it?

Upvotes: 1

Views: 134

Answers (2)

Niki Yoshiuchi
Niki Yoshiuchi

Reputation: 17541

Setting a pointer to NULL (or zero) after deleting it is not necessary. However it is good practice. For one thing, you won't be able to access some random data if you later dereference the pointer. Additionally, you'll often find code with the following:

if(ptr)
{
  delete ptr;
  ptr = NULL;
}

So setting the pointer to NULL will ensure it won't be deleted twice.

Finally, you might find code like this:

void foo(bar *ptr)
{
  if(!ptr) throw Exception(); // or return, or do some other error checking
  // ...
}

And you'd probably want that safety check to be hit.

Upvotes: 2

Cogwheel
Cogwheel

Reputation: 23217

It's not necessary, but it's always a good idea to set pointers to NULL (0) when you're done with them. That way if you pass it to a function (which would be a bug), it will likely give you an error rather than trying to operate on invalid memory (makes the bug much easier to track down). And it also makes conditionals simpler.

Upvotes: 3

Related Questions