释放从C函数返回的内存

Kai*_*Kai 5 c free file

在C中,这是从释放函数返回的内存时更好的做法:

  • 提供一个"析构函数"函数,封装对free()的调用.
  • 要求用户自己释放()返回的指针.

例如,要打开和关闭我们执行的文件:

FILE* f = fopen("blah", "w");
fclose(f);
Run Code Online (Sandbox Code Playgroud)

这更适合:

FILE* f = fopen("blah", "w");
fclose(f);
free(f);
Run Code Online (Sandbox Code Playgroud)

警告:不要在FILE指针上调用free().我只在这里使用它假设的实现.

那么局部变量指向返回的内存的情况呢?免费()有害吗?(或者也许永远不应该这样做)

FILE f = &fopen("blah", "w");
fclose(&f);
Run Code Online (Sandbox Code Playgroud)

Ada*_*itz 14

分配和释放内存的最佳选择是对称地进行.即如果调用者分配内存,让调用者释放它.如果您的API分配内存(被调用者),那么您的API应该释放它.

调用者alloc/free的示例:

int * mymem = (int *)malloc(20 * sizeof(int));
...
a_func_to_call(mymem);
...
free(mymem);
Run Code Online (Sandbox Code Playgroud)

callee alloc/free的示例:

FILE* f = fopen("blah", "w"); // allocs a FILE struct
fclose(f); // The implementation of fclose() will do what's necessary to 
           // free resources and if it chooses to deallocate any memory
           // previously allocated
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 10

你永远不应该释放文件 - fclose句柄正确释放资源.通常,只有malloc直接分配的自由指针.大多数其他指针都有自己的资源清理功能.

话虽如此,关于你的初步问题:

我发现提供析构函数通常是更好的做法,原因有三个.

1)在许多情况下,免费是不合适的,这对您的最终用户来说可能并不明显.文件*是一个很好的例子 - 你不应该打电话给free(f);上面...

2)如果你在DLL中使用它,根据运行时,封装的免费功能可以解决混合运行时的许多微妙错误,特别是在Windows平台上.尝试在VS2008中使用VS2005中编译的DLL,如果碰巧在一个平台的代码中释放内存,则会导致问题.具有"包装"功能来处理内存管理可以解决这个重要问题.

3)许多C API函数以这种方式工作 - 例如使用fopen/fclose的FILE*.这对您图书馆的用户来说并不奇怪.


Mar*_*ett 5

你不能释放FILE*它没有被malloc分配.
由于您不负责分配它 - 您不应该释放它.