A raw pointer is usually initialized to the value of NULL
in C++:
int* aNum = NULL;
This indicates that the pointer aNum
points to the value of 0
in most implementations. It can be thought of as a 0 in mathematics, where the length of the following vector is 0 and the direction is undefined. Similarly, aNum
in the above statement is pointing to an undefined value. So, dereferencing aNum
leads to a segmentation fault or access violation.
In C++11, a nullptr
constant has been introduced that can be implicitly converted to any pointer type.
int* aNum = nullptr;
A possible implementation for NULL
is:
#define NULL 0 // Implementation prior to C++11 #define NULL nullptr // Implementation since C++11 typedef decltype(nullptr) std::nullptr_t;
The first definition above can lead to ambiguity in the following code:
void aFunction(MyClass *); // MyClass is a user defined class void aFunction(int); // overloaded function that takes an int MyClass* anInstance = NULL; // Prior to C++11 implementation of NULL aFunction(anInstance);
The above call to aFunction(anInstance)
will call aFunction(int)
, because NULL
resolves to 0
and will cause unintentional behavior. In C++11 implementation of NULL
, aFunction(anInstance)
will resolve to aFunction(MyClass*)
because NULL
resolves to nullptr
which resolves to MyClass*
type.