C++ FAQ Celebrating Twenty-One Years of the C++ FAQ!!!
(Click here for a personal note from Marshall Cline.)
Section 16:
16.1 Does delete p delete the pointer p, or the pointed-to-data *p?
16.2 Is it safe to delete the same pointer twice?
16.3 Can I free() pointers allocated with new? Can I delete pointers allocated with malloc()?
16.4 Benefits of new over malloc()?
16.5 Can I use realloc() on pointers allocated via new?
16.6 Checking for NULL after p = new Fred()?
16.7 How can I convince my (older) compiler to automatically check new to see if it returns NULL?
16.8 Checking for NULL before delete p?
16.9 What are the two steps that happen when I say delete p?
16.10 Does p = new Fred() leak memory if the ctor throws an exception?
16.11 How do I allocate / unallocate an array of things?
16.12 What if I forget the [] when deleteing an array allocated via new T[n]?
16.13 Can I drop the [] when deleteing an array of some built-in type (char, int, etc)?
16.14 After p = new Fred[n], how does the compiler know there are n objects to be destructed during delete[] p?
16.15 Is it legal (and moral) for a member function to say delete this?
16.16 How do I allocate multidimensional arrays using new?
16.17 How to simplify the Matrix code from the previous FAQ?
16.18 How to make the Matrix class generic?
16.19 What's another way to build a Matrix template?
16.20 Does C++ have arrays whose length can be specified at run-time?
16.21 Allocating all objects via new, not local/global/static?
16.22 How do I do simple reference counting?
16.23 How do I provide reference counting with copy-on-write semantics?
16.24 How do I provide reference counting with copy-on-write semantics for a hierarchy of classes?
16.25 Preventing people from subverting the reference counting mechanism?
16.26 Can I use a garbage collector in C++?
16.27 What are the two kinds of garbage collectors for C++?
16.28 Where can I get more info on garbage collectors for C++?
[16.6] Do I need to check for NULL after p = new Fred()?

No! (But if you have an ancient, stone-age compiler, you may have to force the new operator to throw an exception if it runs out of memory.)

It turns out to be a real pain to always write explicit NULL tests after every new allocation. Code like the following is very tedious:

Fred* p = new Fred();
if (p == NULL)     only needed if your compiler is from the Stone Age!
  throw std::bad_alloc();
If your compiler doesn't support (or if you refuse to use) exceptions, your code might be even more tedious:
Fred* p = new Fred();
if (p == NULL) {     only needed if your compiler is from the Stone Age!
  std::cerr << "Couldn't allocate memory for a Fred" << std::endl;
Take heart. In C++, if the runtime system cannot allocate sizeof(Fred) bytes of memory during p = new Fred(), a std::bad_alloc exception will be thrown. Unlike malloc(), new never returns NULL!

Therefore you should simply write:

Fred* p = new Fred();   no need to check if p is NULL
However, if your compiler is ancient, it may not yet support this. Find out by checking your compiler's documentation under "new". If it is ancient, you may have to force the compiler to have this behavior.

Note: If you are using Microsoft Visual C++, to get new to throw an exception when it fails you must #include some standard header in at least one of your .cpp files. For example, you could #include <new> (or <iostream> or <string> or ...).