我需要 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_CreateRGBSurface
和 SDL_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;
}
我有一个空指针作为函数的参数。它当前指向一个 int。当我尝试释放它时,它 returns 是一个总线错误。我应该释放空指针吗?如果可以,我该怎么做?
每个 new
需要对应的 delete
或每个 malloc
需要对应的 free
。
如果您从未编写过 new 或 malloc,则不需要 free。
有些图书馆有自己的新版本和免费版本。他们也会有相应的方法,并希望有一些文档。喜欢 SDL_CreateRGBSurface
和 SDL_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;
}