c++11的碎碎念之checked_delete

1540阅读 0评论2021-01-28 stolennnxb
分类:C/C++

checked_delete是对c++delete关键字的加强,可以在编译期间保证delete或delete[]删除的是一个指向“完整类型”的指针。如:

点击(此处)折叠或打开

  1. class demo;

  2. void do_delete(demo *p){
  3.     delete p;
  4. }
  5. class demo{...};

  6. int main(){
  7.     auto p = new demo();
  8.     do_delete(p);
  9.  
  10. }
如果这样写就只会有warning,如果写成下面这样,就会报错:

点击(此处)折叠或打开

  1. class demo;

  2.     void do_delete(demo *p){
  3.         checked_delete(p);
  4.     }
  5.     class demo{...};

  6.     int main(){
  7.         auto p = new demo();
  8.         do_delete(p);// 编译出错
  9.      
  10.     }
其实现原理比较简单,

点击(此处)折叠或打开

  1. template<class T> inline void checked_delete(T *x){
  2.     typedef char type_must_be_complete[sizeof(T)?1:-1];// 如果是非完整,sizeof返回0,数组大小为-1,报错
  3.     (void) sizeof(type_must_be_complete);
  4.     delete x;
  5. }
其实智能指针都在内部调用了checked_delete,可以自动管理指针的生命周期,而且是异常安全的



上一篇:c++11的碎碎念之lambda表达式
下一篇:c++11的碎碎念之新添加概念