当delete不完整类类型对象的时候,不会调用对象的析构函数,导致内存泄漏。所以要避免delete 不确定类型。
首先解释下不完整类类型Imcomplete class type:只见声明不见定义的类、结构体或是联合体;相对应的就是complete type,就是编译器可以确定的类型。
我们这里要重点介绍的是boost库中的使用的方法,方法使用的非常巧妙。整理如下:
//utiles.h
template<typename 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;
}
template<typename T>
inline void checked_arraydelete(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;
}
template<typename T>
struct checked_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const
{
checked_delete(p);
}
};
template<typename T>
struct checked_arraydeleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const
{
checked_arraydelete(p);
}
};