指针参数
改变指针指向的内容不需要传递指针地址,改变指针的指向,一定要传递指针的地址
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; }