在C中,这是从释放函数返回的内存时更好的做法:
例如,要打开和关闭我们执行的文件:
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*.这对您图书馆的用户来说并不奇怪.