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

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

// filename : object.h

class Object
{
public:
  Object();
  ~Object();
};
// filename : object.cpp
#include <stdio.h>
#include "object.h"

Object::Object()
{
  printf("%s\n", "A::A()");
}

Object::~Object()
{
  printf("%s\n", "A::~A()");
}
// filename : del.h
class Object;

void delete_obj(Object* obj) { delete obj; }
// main.cpp
#include "del.h"
#include "object.h"
int main()
{  
  Object *obj = new Object;
  delete_obj(obj);
}

解决方法

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

template<class T> inline void checked_delete(T * x)
{
  typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
  (void) sizeof(type_must_be_complete);
  delete x;
}

template<class T> inline void checked_array_delete(T * x)
{
  typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
  (void) sizeof(type_must_be_complete);
  delete [] x;
}

(完)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值