zoukankan      html  css  js  c++  java
  • #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;
    	}
    }
    
  • 相关阅读:
    随感
    createDocumentFragment() 创建文档碎片节点
    关于数组的map、reduce、filter
    CSS中的常用属性
    精通CSS version2笔记2.小知识
    精通CSS version2笔记之⒈选择器
    Spring入门_01
    Spring入门
    Java 流程控制
    Java 数据类型
  • 原文地址:https://www.cnblogs.com/chengjundu/p/11088175.html
Copyright © 2011-2022 走看看