STL容器对元素的要求:
1) 必须是可拷贝的,也就是有一个拷贝构造函数。
有些类就不适合作为容器的元素,例如:auto_ptr
2) 必须是可赋值的,也就是说=操作符。
3)必须有析构函数而且不能是私有的。
*********************************************************************************************
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}
猛一看,没明白
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
这两句的意思。 上网搜了搜,才发现,深有含义呀:
如果你试图删除一个指针,而该指针指向的是一个带有非平凡析构函数[1]的不完整类型[2],结果将是未定义的行为。编译器会报错:
boost/checked_delete.hpp:34: error: invalid application of 'sizeof' to an incomplete type
boost/checked_delete.hpp:34: error: creating array with size zero ('-1')
也就是说在前向声明类,而源文件没有包含相应的头文件, 并且该类自定义了析构函数时, delete 该前向声明类会仅仅负责清理内存,而不会调用该类的析构函数,这样的话有可能造成内存泄漏。
标准说法是,类的一个或多个直接基类,或者一个或多个非静态数据成员,具有用户定义的析构函数。