boost提供了一个安全的用于delete模板函数,在文件checked_delete.hpp中:
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;
}
为什么? 因为对一个incomplete type的指针运行delete操作结果是未定义的。
什么时候会出现incomplete type的指针,举个例子:
class B;
void Destroy(B* b) {
delete b;
}
如果你不调用这Destroy函数的话,G++不会报错,但是会显示警告:
main.cpp:30:12: warning: possible problem detected in invocation of delete operator: [enabled by default]
main.cpp:29:6: warning: ‘b’ has incomplete type [enabled by default]
main.cpp:27:7: warning: forward declaration of ‘class B’ [enabled by default]
main.cpp:30:12: note: neither the destructor nor the c