#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