最近在读有关C语言指针方面的书籍,看到有关malloc系列函数申请内存释放使用宏定义的方式。自己也动手试了一下,感觉还不错记录一下分享给小伙伴们。
实现和应用
#include <stdlib.h>
#include <stdio.h>
void safeFreePtr(void **p_ptr)
{
if (p_ptr != NULL && *p_ptr != NULL)
{
free(*p_ptr);
*p_ptr = NULL;
}
}
/** 宏定义 */
#define safeFree(ptr) safeFreePtr((void **)&(ptr))
int main(int argc, char const *argv[])
{
int *a = (int *)malloc(sizeof(int));
*a = 10;
printf("Before: %p\n", a);
safeFree(a);
printf("After: %p\n", a);
safeFree(a);
return 0;
}
运行结果:
Before: 0x5634b2e342a0
After: (nil)
可以看出第二次safeFree时打印是:nil,程序没有出错。
对于申请的指针,使用free函数释放时只能free一次,第二次free会报错。
指针free释放后,一定要记得把指针置为NULL,防止悬挂指针。
好处
如果程序中是直接调用safeFreePtr函数是需要显示转换为 void** 指针,若不显示转换则会报警告。在使用宏调用safeFreePtr函数可以避免强制转换。