在看 Understanding and Using C Pointers (这本书真是错漏百出),其中一个例子觉得有问题,但是勘误上没有,想求证下。
#include <stdio.h>
#include <stdlib.h>
#define safeFree(p) saferFree((void**)&(p))
void saferFree(void** pp)
{
if (pp != NULL && *pp != NULL) {
free(*pp);
*pp = NULL;
}
}
int main()
{
int* pi;
pi = (int*)malloc(sizeof(int));
*pi = 5;
printf("Before: %p\n", pi);
safeFree(pi);
printf("After: %p\n", pi);
safeFree(pi);
return (EXIT_SUCCESS);
}
作者想写个 free 的封装,来避免 double free 的问题。根据这里我觉得这里的 void **
不对,应该是 void *
才对。
#include <stdio.h>
#include <stdlib.h>
void saferFree(void* p)
{
int** ptr = p;
if (ptr && *ptr) {
free(*ptr);
*ptr = NULL;
}
}
int main()
{
int* pi = malloc(sizeof(*pi));
*pi = 5;
printf("Before: %p\n", pi);
saferFree(&pi);
printf("After: %p\n", pi);
saferFree(&pi);
return 0;
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.