我是否需要/可以释放C中的空指针?

我是否需要/可以释放C中的空指针?,c,pointers,void,void-pointers,C,Pointers,Void,Void Pointers,我有一个空指针作为函数的参数。它当前指向一个int。当我尝试释放它时,它返回一个总线错误。我应该释放空指针吗?如果是这样,我该怎么做?您需要为每个malloc提供相应的删除新或免费。 如果你从未写过新的或malloc,你就不需要免费的 有些图书馆有自己的新版本和免费版本。他们也会有相应的方法,希望有一些文档。像SDL\u CreateRGBSurface和SDL\u FreeSurface您必须首先回答两个问题: 它以前是否分配了malloc系列功能(例如calloc) 进行函数调用时是否继承

我有一个空指针作为函数的参数。它当前指向一个int。当我尝试释放它时,它返回一个总线错误。我应该释放空指针吗?如果是这样,我该怎么做?

您需要为每个
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()
的部分的方法。这在很多情况下都是隐含的,或者当有人非常仔细地记录下来时,就明确表示出来了。回答得很好。最重要的部分是“仔细阅读文档,了解您的职责。”