Debug Pointer: a quick overview

Let’s focus on some keypoints of my debug_ptr:

  • What a debug_ptr is used for? A debug_ptr can be used like a standard pointer type to hold the address of a dynamically allocated object: typedef_pointer(int*, int_p); int_p p = new int(0);

  • How could it be useful? If you forget to delete a dynamically allocated object before loosing its last reference, you are probably creating a memory leak. A debug_ptr warns you about this fact using a warning policy.

    struct ThrowPolicy { ThrowPolicy() { throw std::runtime_error(“lost reference to undeleted object”); } }; struct PrintPolicy { PrintPolicy() { std::cerr << “WARNING: lost reference ” “to undeleted object” << std::endl; } };

  • How much does it cost? (in performance terms) The features of debug_ptr are mostly useful in “debug mode”. In a production release, you may not want use the features of a debug_ptr class (although you can), because of the performance losses due to the reference counting.

  • How did I address this issue? You can compile your software by defining ENABLE_DEBUG_TYPES to get the debug_ptr feature turned on. Otherwise all the debug_ptr features are turned off by a macro that will substitute any occurrence of debug_ptr with a T*. This will avoid any overhead at compile and run time.

    #ifndef ENABLE_DEBUG_TYPES #define typedef_pointer(Type, Alias, …) typedef Type Alias #define typedef_array(Type, Alias, …) typedef Type Alias #else // ENABLE_DEBUG_TYPES … #endif

  • How debug_ptr syntax differs by the one of a standard pointer type? debug_ptr it’s intended to be used just like any other smart_ptr, and in most of the cases you should not notice any difference in creating, copying, dereferencing, assigning, and deleting…

    typedef_pointer(int*, int_p); int_p p = new int(0); int_p p_other = new int(0); *p = 63; int_p p_other = p; delete p_other;

  • How did you get the same delete syntax of a standard pointer type? By defining a default cast operator to a pointer-to-deleter-class. The cast operator will be implicitly called and a new deleter object returns to operator delete. So, delete operator, deletes the deleter-class.

    operator deleter*() const { return deleter::new_deleter(pd_); }

And that’s all folks!

If you have any question, just leave a comment. If you like this project, or have any other ideas about what could be the next step of the debug_ptr, fork the project on github and have fun :)

git clone git://github.com/cybercase/debug_ptr.git # clone the repo
cd debug_ptr
g++ -Wall -o test debug_ptr_test.cc -DENABLE_DEBUG_TYPES
./test

—01/09/2012