delete
Using new
to request memory when you need it is just the more glamorous half of the C++ memory-management package. The other half is the delete
operator, which enables you to return memory to the memory pool when you are finished with it. That is an important step toward making the most effective use of memory. Memory that you return, or free, can then be reused by other parts of the program. You use delete
by following it with a pointer to a block of memory originally allocated with new
:
int * ps = new int; // allocate memory with new
. . . // use the memory
delete ps; // free memory with delete when done
This removes the memory to which ps
points; it doesn’t remove the pointer ps
itself. You can reuse ps
, for example, to point to another new
allocation. You should always balance a use of new
with a use of delete
; otherwise, you can wind up with a memory leak—that is, memory that has been allocated but can no longer be used. If a memory leak grows too large, it can bring a program seeking more memory to a halt.
You should not attempt to free a block of memory that you have previously freed. The C++ Standard says the result of such an attempt is undefined, meaning that the consequences could be anything. Also you cannot use delete
to free memory created by declaring ordinary variables:
int * ps = new int; // ok
delete ps; // ok
delete ps; // not ok now
int jugs = 5; // ok
int * pi = &jugs; // ok
delete pi; // not allowed, memory not allocated by new
You should use delete
only to free memory allocated with new
. However, it is safe to apply delete
to a null pointer.
Note that the critical requirement for using delete
is to use it with memory allocated by new
. This doesn’t mean you have to use the same pointer you used with new
; instead, you have to use the same address:
int * ps = new int; // allocate memory
int * pq = ps; // set second pointer to same block
delete pq; // delete with second pointer
Ordinarily, you won’t create two pointers to the same block of memory because that raises the possibility that you will mistakenly try to delete the same block twice. But as you’ll soon see, using a second pointer does make sense when you work with a function that returns a pointer.
13.58.121.8