#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;
    }
}

猜你喜欢

转载自www.cnblogs.com/chengjundu/p/11088175.html