我需要 to/can 我在 C 中释放一个 void 指针吗?

Do I need to/can I free a void pointer in C?

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

每个 new 需要对应的 delete 或每个 malloc 需要对应的 free。 如果您从未编写过 new 或 malloc,则不需要 free。

有些图书馆有自己的新版本和免费版本。他们也会有相应的方法,并希望有一些文档。喜欢 SDL_CreateRGBSurfaceSDL_FreeSurface.

您必须先回答两个问题:

  • 它之前是否分配了 malloc 家庭功能(例如 calloc)?
  • 您在进行函数调用时是否继承了它的所有权?

如果这两个问题的答案都是 "Yes",则由您自行决定,但您可能会在适当的时间和地点这样做以避免 "use after free" 类型错误。

当您继承指针的所有权时,您继承了在使用完指针后调用 free() 的责任,或者将所有权传递给代码的另一部分。如果您未能履行此职责,就会出现内存泄漏。

作为一般规则,你应该永远不要 free() 一个指针,除非你确定那是你应该做的,并且你被允许做它。

一些函数 return 指向您不拥有的东西,即使您拥有,它们对 free() 也无效,因为它们可能会以某种方式偏移。只有从 malloc 类型函数中 return 得到的原始指针才能与 free().

一起使用

例如:

void* getBuffer(size_t size) {
  globalBufferOffset += size;
  return &globalBuffer[globalBufferOffset];
}

这 return 是某个结构中间的指针,该结构可能动态分配也可能不动态分配。你不拥有它。你不应该在上面调用 free()

仔细阅读文档以了解您的职责。使用完指针后,您可能需要调用一个特殊的自由类型函数。你不可以。您可能需要注意线程安全。在做出决定之前,您需要了解这里可能发生的很多事情。

如果指针是由malloc或类似的东西分配的,你必须释放。 因为,malloc 函数 returns void * 指针,所以是的,你 can/need 释放这个指针。

有些情况你不应该释放,例如下面的代码:

#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;
}