Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1305545
  • 博文数量: 167
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2187
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(167)

文章存档

2021年(9)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2021-01-28 09:28:51

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,可以自动管理指针的生命周期,而且是异常安全的



阅读(140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~