指针参数

 改变指针指向的内容不需要传递指针地址,改变指针的指向,一定要传递指针的地址

     void mem_free(void *ptr)

     {

          if(NULL != ptr)

         {

               free(ptr);

               ptr = NULL;

        }

     }


  int _tmain(int argc, _TCHAR* argv[])

   {  

    char *pBuf = (char *)malloc(512);

     mem_free(pBuf);   

     return 0;

    }

看上去,没有问题,但是调试发现,pBuf并没有被置为NULL,当第一次mem_free的时候,free确实把内存给清除了,但是坏就坏在ptr = NULL;上,注意这个时候ptr只是一个指向buff指针的副本,也就是这个时候运行时态的指针可以理解成这样ptr->buff->heap,free是因为没有改变ptr的指向,只是free掉了值,所以heap中的值被清除了,但是ptr = NULL,其实是切断了ptr –> buff的这根链,那么,buff ->heap这个链没有断开,所以其实buff还是指向这heap这个内存,虽然heap中已经不存在任何有用的数据了。但是我们的本意是要断开buff –> heap这个链,所以这个函数应该写成传递二级指针:

void mem_free(void **pBuf)
{
    if (NULL != *pBuf)
    {
        free(*pBuf);
        *pBuf = NULL;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    char *pBuf = (char *)malloc(512);

    mem_free((void**)&pBuf);
    
    return 0;
}

 

posted @ 2016-05-09 15:39  风狼啸天  阅读(155)  评论(0编辑  收藏  举报