C/C++学习心得(1):保证delete()掉的是“真实”的指针

举个例子来说明:

//=================================================================

//DeleteObject.h

 

class Item;

 

class DeleteObject

{

public:

    DeleteObject(void);

public:

    ~DeleteObject(void);

 

    void DeleteItem(Item* p);

};

 

//=================================================================

//DeleteObject.cpp

 

#include "StdAfx.h"

#include "DeleteObject.h"

#include <boost/checked_delete.hpp>

 

DeleteObject::DeleteObject(void)

{}

 

DeleteObject::~DeleteObject(void)

{}

 

void DeleteObject::DeleteItem( Item* p )

{

    delete p;

}

 

//=================================================================

//item.h

 

#include <iostream>

 

class Item

{

public:

    ~Item()

    {

        std::cout<<"Item destruction ";

    }

};

 

//=================================================================

//main.cpp

 

#include "DeleteObject.h"

#include "Item.h"

 

int main(int argc,char** argv)

{

       DeleteObject del;

      del.DeleteItem(new Item);

 

       Return 0;

}

 

//=================================================================

结果Item的析构函数没有被调用!!!!!

 

这是因为DeleteObject并不知道Item的详细定义,这是C++中一个很危险的错误!(还好编译器一般都给warning

 

怎么解决这个问题呢?

我们知道,对于不完整类型的指针:

class incomplete;

incomplete* p;

delete p;

在这里,p并未指向一个实例且未指向0,因此delete p是危险的,但根据编译器不同,这里可能只会给出一个warning而不是error。因此,可以:

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;

}

cheched_delete代码中利用了“typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];”,当p未指向实例时,sizeof(T)给出的是0,根据代码规则,-1是不能作为数组的size的,因此,这里相当于强制编译器给出error而不是 warning

 

 

还有一个最简单的测试:

C/C++ code

 

// 此处T是不完整类型 , 编译会出错

typedef char T[];

typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];

(void) sizeof(type_must_be_complete);

 

// 此处T是完整类型 , 编译不会出错

typedef char T[1];

typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];

(void) sizeof(type_must_be_complete);

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值