Boost C++ 库

...世界上最受尊敬和专家设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码标准

PrevUpHomeNext

checked_delete

概述
概要
checked_delete
checked_array_delete
checked_deleter
checked_array_deleter
致谢

作者

  • Beman Dawes
  • Dave Abrahams
  • Vladimir Prus
  • Rainer Deyke
  • John Maddock

头文件 <boost/checked_delete.hpp> 定义了两个函数模板,checked_deletechecked_array_delete,以及两个类模板,checked_deleterchecked_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_deletechecked_array_delete 最初是 <boost/utility.hpp> 的一部分,并且文档确认 Beman Dawes、Dave Abrahams、Vladimir Prus、Rainer Deyke、John Maddock 和其他人是贡献者。


PrevUpHomeNext