+--+--+ File: deleter.h +--+--+
// 对Object只声明,不定义,编译器不会报错 class Object; void delete_object(Object* p);
+--+--+ File: deleter.cpp +--+--+
#include "deleter.h" // 不知道Object的dtor也可以delete,编译器顶多会警告,不会报错。因为C++标准允许 void delete_object(Object* p) { delete p; }
+--+--+ File: main.cpp +--+--+
#include "deleter.h" class Object { ~Object() { // 不会被delete_object调用 ... } }; int main() { Object* p = new Object; delete_object(p); }
boost\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; }
没有定义,sizeof是不依的,就算它依了,负数个元素的数组编译器是绝对不会依的。
这样,就把编译器的警告变成了错误,程序员不得不改。
本文探讨了在C++中如何安全地删除未完全定义的类型的对象,通过使用boost::checked_delete来避免编译器警告并确保代码健壮性。
407

被折叠的 条评论
为什么被折叠?



