指针参数:这个问题也可以归结为内存泄漏。对于malloc的变量,free之后一定要置为NULL,这样我们就可以通过判断这个自增是否为NULL来编程。所以为了简单和不至于忘记最后的一个置NULL操作,我把这个过程写成了函数:
void mem_free(void *ptr)
{
if(NULL != ptr)
{
free(ptr);
ptr = NULL;
}
}
不仔细看没发现问题吧,把ptr的指针free掉,然后NULL操作,但是问题来了,当我为char *buff 执行mem_free(buff)函数后,发现第二次运行mem_free(buff)发现NULL != ptr竟然为true,郁闷了吧?这个问题搞了我半天时间,后来查看相关书籍才发现,当第一次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 **ptr)
{
if(NULL != *ptr)
{
free(*ptr);
*ptr = NULL;
}
}
这个问题可以总结为:改变指针指向的内容不需要传递指针地址,改变指针的指向,一定要传递指针的地址。