在下面的函数中,设计为释放一些分配给类型指针的内存Maze,Maze它是我在另一个文件中定义的结构.
我收到编译器错误nonnull argument 'maze' compared to NULL
这只是一个警告,但我被限制为打开警告.
这是函数的代码:
void free_maze(Maze *maze) {
if (maze == NULL) {
return;
}
free(maze);
return;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是检查指向结构的指针是否为NULL的正确方法.我在这做错了什么?
警告的原因可能是free_maze看起来类似于此的声明:
extern void free_maze (Maze *maze)
__attribute__((nonnull));
Run Code Online (Sandbox Code Playgroud)
__attribute__((nonnull)); 是GCC特定的扩展.
所以声明说不NULL应该传递给free_maze.编译器将尝试检测违反此约束的情况并发出警告.因为你不应该传递NULL,所以检查它是没有意义的.
即使没有属性,也不需要检查,因为free(NULL)保证是安全的.
关于你的编辑:一个电话
free(maze);
Run Code Online (Sandbox Code Playgroud)
不会改变maze调用者的范围.如果您不小心free使用相同的指针再次调用,则第二次调用将不会NULL带有悬空指针,导致未定义的行为.只是不要做双重免费.