(C++) null
January 11, 2018 · View on GitHub
(C++) null
null denotes a pointer pointing nowhere.
int main() { int * p = 0; }
Smart pointers and null
Boost smart pointers check for null themselves, so there is no need to check these to be inititialized. In the example below a member variable of a class is requested from an unitialized smart pointer. The program will abort and the runtime error will be shown.
#include <boost/scoped_ptr.hpp> #include <boost/shared_ptr.hpp> struct Test { Test(const int x) : m_x(x) {} const int m_x; }; int main() { { boost::shared_ptr<Test> p; p->m_x; //Good: uninitialized pointer detected by Boost } { boost::scoped_ptr<Test> p; p->m_x; //Good: uninitialized pointer detected by Boost } }
The code below shows that initializing a boost::shared_ptr with null will not be easy, but even when it succeeds, boost::shared_ptr will check itself for null. A boost::scoped_ptr can be null, but will check itself for it as well.
#include <boost/scoped_ptr.hpp> #include <boost/shared_ptr.hpp> struct Test { Test(const int x) : m_x(x) {} const int m_x; }; Test * CreateNullPointer() { return 0; } int main() { { boost::shared_ptr<Test> p; //p.reset(0); //Good: does not compile: 0 is an integer //p.reset(NULL); //Good: does not compile p.reset(CreateNullPointer()); //Bad: tricked the compiler //p->m_x; //Good: uninitialized pointer detected by Boost } { boost::scoped_ptr<Test> p; p.reset(0); //Valid: boost::scoped_ptr can be empty p.reset(CreateNullPointer()); //Valid: boost::scoped_ptr can be empty p->m_x; //Good: uninitialized pointer detected by Boost } }
Advice
- Prefer nullptr to NULL and 0 [1]
References
- Scott Meyers. C++ And Beyond 2012 session: 'Initial thoughts on Effective C++11'. 2012. 'Prefer nullptr to NULL and 0'