头文件 <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 和其他人是贡献者。