检查不完全类型

来源:互联网 发布:linux 二进制文件 编辑:程序博客网 时间:2024/06/06 23:17

看muduo库时候,对这里挺有疑问的。

检查不完全类型:

举例如下

//BB.h

[cpp] view plain copy
  1. #include <iostream>  
  2.   2 class BB  
  3.   3 {  
  4.   4 public:  
  5.   5     BB()  
  6.   6     {  
  7.   7         std::cout<<"BB"<<std::endl;  
  8.   8     }  
  9.   9     ~BB()  
  10.  10     {  
  11.  11         std::cout<<"~BB"<<std::endl;  
  12.  12     }  
  13.  13 };  

//AA.cpp

[cpp] view plain copy
  1.  1 #include <iostream>  
  2.  1 #include <iostream>  
  3.  2 class BB;  
  4.  3 class AA  
  5.  4 {  
  6.  5     public:  
  7.  6         void deleteBB(BB* pb)  
  8.  7         {  
  9.  8             delete pb;  
  10.  9         }  
  11. 10   
  12. 11 };  
  13. 12   
  14. 13   
  15. 14 int main()  
  16. 15 {  
  17. 16     AA a;  
  18. 17     //a.deleteBB(new BB);  
  19. 18     return 0;  
  20. 19 }  

当我们在AA.cpp中只声明了class BB,并没有对其定义,这时如果不调用deleteBB()编译器是不对其报错的,只是warning

AA.cpp: In member function ‘void AA::deleteBB(BB*)’:
AA.cpp:8:11: warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]
    delete pb;
           ^
AA.cpp:6:21: warning: ‘pb’ has incomplete type
   void deleteBB(BB* pb)
                     ^
AA.cpp:2:7: note: forward declaration of ‘class BB’
 class BB;
       ^
AA.cpp:8:11: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
    delete pb;

我们应该尽量让错误在编译时出现,而不是在执行时,所用可以使用一下方法

[cpp] view plain copy
  1. void deleteBB(BB* pb)  
  2.   7         {  
  3.   8             typedef char type_must_be_complete[sizeof(BB) ? 0:-1];  
  4.   9             (voidsizeof(type_must_be_complete);  
  5.  10             delete pb;  
  6.  11         }  
如果BB是不完全类型那么sizeof(BB)就应该是0,type_must_be_complete[-1],数组是不能为负数的,所以就会报错

也可以使用boost的checked_array_delete(T * x);在头文件checked_delete.hpp中;

源码:

[cpp] view plain copy
  1. template<class T> inline void checked_array_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. }  

原创粉丝点击