#define 宏实现函数功能可能存在的问题

#define 宏实现函数功能的问题

情形1

#define free_ptr(p) \
    if(p) delete p; p = nullptr;

在调用free_ptr(p)的地方展开看这段代码:

if(p)
    delete p;
    p = nullptr;

其实判断条件if(p),只对delete p 有效。不管if(p)是否满足执行条件p =nullptr都会执行。这么写可能直观一点

if(p)
    delete p;
p = nullptr;

显然这种操作和我们的意图是不一样的。

情形2

#define free_ptr(p) \
    delete p; p = nullptr;

Object* p = new Object;
if(p) free_ptr(p);

展开代码:

Object* p = new Object;
if(p) 
    delete p;
p = nullptr;

显然这种操作也是不符合我们意图的。

情形3

#define free_ptr(p) \
    if(p){\
        delete p; p = nullptr;\
    }

Object* p = new Object;
free_ptr(p);

展开调用代码:

Object* p = new Object;
if(p){
    delete p;
    p = nullptr;
}

可以实现意图。

情形4

#define free_ptr(p) \
    do{\
        delete p; p = nullptr;\
    }while(0);

Object* p = new Object;
if(p) free_ptr(p);

展开调用代码:

Object* p = new Object;
if(p) 
    do{
        delete p;
        p = nullptr;
    }while(0)

显然使用do{...}while(0), 可以实现意图。

使用宏来实现一个函数的功能是危险的,这么做的时候也十分小心。相比于宏,可能使用内联函数更为妥当。

template<typename T>
inline void  free_ptr(T** p)
{
    if(*p)
    {
        delete *p;
        *p = nullptr;
    }
}

转载于:https://www.cnblogs.com/chengjundu/p/11088175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值