[转] c++避免delete不完整类型 --checked_delete

发布时间:2014-6-3 12:02
分类名称:默认分类


 

Fromhttp://blog.csdn.net/hzyong_c/article/details/7777344

C++中,delete一个类型不完整的类对象的指针,编译器会发出警告,不幸的是,程序员有时候会忽略这种警告。在下面的例子中,main函数里new了一个类指针,调用delete_obj函数delete企图这个指针,delete_obj函数定义在del.h文件中,然而delete_obj函数只能"看见"Object类的声明,不能"看见"其定义。运行的结果发现Object析构没被调用。

  1. // filename : object.h  
  2.     
  3. class Object  
  4. {  
  5. public:  
  6.   Object();  
  7.   ~Object();  
  8. };  
  9. // filename : object.cpp  
  10. #include <stdio.h>  
  11. #include "object.h"  
  12.     
  13. Object::Object()  
  14. {  
  15.   printf("%s\n""A::A()");  
  16. }  
  17.     
  18. Object::~Object()  
  19. {  
  20.   printf("%s\n""A::~A()");  
  21. }  
  22. // filename : del.h  
  23. class Object;  
  24.     
  25. void delete_obj(Object* obj) { delete obj; }  
  26. // main.cpp  
  27. #include "del.h"  
  28. #include "object.h"  
  29. int main()  
  30. {    
  31.   Object *obj = new Object;  
  32.   delete_obj(obj);  
  33. }  


解决方法

下面是boost::checked_delete的实现,在Boost Utility库中,如果T只声明了而未定义,sizeof(T)将返回0,此时checked_delete将因为声明-1个成员的数组而引发错误。

  1. template<class T> inline void checked_delete(T * x)  
  2. {  
  3.   typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];  
  4.   (voidsizeof(type_must_be_complete);  
  5.   delete x;  
  6. }  
  7.     
  8. template<class T> inline void checked_array_delete(T * x)  
  9. {  
  10.   typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];  
  11.   (voidsizeof(type_must_be_complete);  
  12.   delete [] x;  
  13. }  


(完)