我是否需要/可以释放C中的空指针?
我有一个空指针作为函数的参数。它当前指向一个int。当我尝试释放它时,它返回一个总线错误。我应该释放空指针吗?如果是这样,我该怎么做?您需要为每个我是否需要/可以释放C中的空指针?,c,pointers,void,void-pointers,C,Pointers,Void,Void Pointers,我有一个空指针作为函数的参数。它当前指向一个int。当我尝试释放它时,它返回一个总线错误。我应该释放空指针吗?如果是这样,我该怎么做?您需要为每个malloc提供相应的删除新或免费。 如果你从未写过新的或malloc,你就不需要免费的 有些图书馆有自己的新版本和免费版本。他们也会有相应的方法,希望有一些文档。像SDL\u CreateRGBSurface和SDL\u FreeSurface您必须首先回答两个问题: 它以前是否分配了malloc系列功能(例如calloc) 进行函数调用时是否继承
malloc
提供相应的删除新或免费。
如果你从未写过新的或malloc,你就不需要免费的
有些图书馆有自己的新版本和免费版本。他们也会有相应的方法,希望有一些文档。像SDL\u CreateRGBSurface
和SDL\u FreeSurface
您必须首先回答两个问题:
- 它以前是否分配了
malloc
系列功能(例如calloc
)
- 进行函数调用时是否继承了它的所有权
如果这两个问题的答案都是“是”,那么这是由您自行决定的,尽管您可能会在适当的时间和地点这样做,以避免“免费后使用”类型的错误
当您继承指针的所有权时,您将继承在使用完指针后调用free()
,或将所有权传递给代码的另一部分的责任。如果您未能履行此职责,则会导致内存泄漏
一般来说,你应该永远不要free()
一个指针,除非你明确知道你应该这样做,并且你被允许这样做
有些函数返回指向您不拥有的东西的指针,即使您拥有,它们对于free()
也无效,因为它们可能会以某种方式被偏移。只有从malloc
-type函数返回的原始指针才能与free()
一起使用
例如:
void* getBuffer(size_t size) {
globalBufferOffset += size;
return &globalBuffer[globalBufferOffset];
}
返回某些结构中间的指针,该指针可以动态分配或不动态分配。你不拥有它。您不应该对其调用
free()
仔细阅读文档以了解您的职责。完成指针操作后,可能需要调用一个特殊的自由类型函数。你可能不会。您可能需要注意螺纹安全。在做出决定之前,您需要了解这里可能发生的很多事情。如果指针是由malloc
或类似的东西分配的,您必须释放。
因为malloc
函数返回void*
指针,所以可以/需要释放该指针
有些情况下,您不应释放,例如,下面的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
void *p1, *p2, *p3;
int x, y;
p1 = &x;
p2 = malloc(sizeof(int));
p3 = malloc(10);
*(int*)p2 = y;
p3 = "abc";
free(p1); // it raises the fault because p1 is not allocated by malloc
free(p2); // it's OK
free(p3); // it raises also the fault because p3 points to string literal
return 0;
}
#包括
#包括
int main()
{
无效*p1、*p2、*p3;
int x,y;
p1=&x;
p2=malloc(sizeof(int));
p3=malloc(10);
*(int*)p2=y;
p3=“abc”;
free(p1);//它引发错误,因为p1不是由malloc分配的
免费(p2);//没关系
free(p3);//它还引发错误,因为p3指向字符串文字
返回0;
}
它以前是否分配了malloc
或类似的东西?@tadman否。如果它不是由malloc()
家族中的某个函数返回的,您就无法释放它。@Serket这是您的问题。只有从malloc
、calloc
或realloc
返回的指针才能传递到free
。您不分配或释放指针。您可以分配或释放内存。如果指针指向已分配的内存,则在不再需要时释放内存。如果它不指向已分配的内存,则没有任何内容可供释放。@TonyTannous这就是跟踪代码中负责调用free()
的部分的方法。这在很多情况下都是隐含的,或者当有人非常仔细地记录下来时,就明确表示出来了。回答得很好。最重要的部分是“仔细阅读文档,了解您的职责。”