头文件 <boost/checked_delete.hpp> 定义了两个函数模板,checked_delete 和 checked_array_delete,以及两个类模板,checked_deleter 和 checked_array_deleter。
C++ 标准 5.3.5/5 允许使用 delete 表达式删除指向不完整类类型的指针。当类具有非平凡析构函数或类特定的 operator delete 时,行为是未定义的。某些编译器在删除不完整类型时会发出警告,但不幸的是,并非所有编译器都这样做,并且程序员有时会忽略或禁用警告。
一个特别麻烦的情况是当智能指针的析构函数(例如 boost::scoped_ptr<T>::~scoped_ptr)使用不完整类型实例化时。这通常会导致难以追踪的静默失败。
提供的函数和类模板可以用于防止这些问题,因为它们需要完整类型,否则会导致编译错误。
namespace boost { template<class T> void checked_delete(T * p); template<class T> void checked_array_delete(T * p); template<class T> struct checked_deleter; template<class T> struct checked_array_deleter; }
T 必须是完整类型。表达式 delete p 必须是良构的。delete p;T 必须是完整类型。表达式 delete [] p 必须是良构的。delete [] p;template<class T> struct checked_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * p) const; };
T 必须是完整类型。表达式 delete p 必须是良构的。delete p;template<class T> struct checked_array_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * p) const; };
T 必须是完整类型。表达式 delete [] p 必须是良构的。delete [] p;函数模板 checked_delete 和 checked_array_delete 最初是 <boost/utility.hpp> 的一部分,文档中承认 Beman Dawes、Dave Abrahams、Vladimir Prus、Rainer Deyke、John Maddock 和其他人是贡献者。