Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) NULL

 

NULL is a #defined constant for a pointer pointing nowhere. Prefer using a zero or nullptr [1].

 

int main()
{
  int * p = NULL; //Not preferred
  int * q =    0; //Preferred
}

 

 

 

 

 

Boost 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
  }
}

 

 

 

 

 

References

 

  1. Joint Strike Fighter Air Vehicle C++ Coding Standards for the System Development and Demonstration Program. Document Number 2RDU00001 Rev C. December 2005. AV Rule 175: 'A pointer shall not be compared to NULL or be assigned NULL; use plain 0 instead.'

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict