我在我的程序中有几个方法,我有一个char * str,这是malloc,然后需要在方法结束时返回str。在我需要在这些方法中放入free()语句的地方我很困惑。如果我在返回str之前释放(),那么str是空的,如果我在返回语句之后执行它,它将不会在我猜的正确时间释放?如果我例如在程序释放之前退出程序,这会造成内存泄漏。什么是正确的方法来做到这一点?正确使用free()方法返回+ C
回答
从阅读你的问题,我认为你对malloc和free的作品有一个错误的理解。
Malloc将在您的进程堆上分配空间。这个堆是global,这意味着你可以从代码中的任何地方访问它(而不仅仅是在你的函数中)。因此,您也可以在代码中的任意位置免费使用。如果你返回一个指向已分配空间的指针,那么在同一个函数中释放它是没有意义的(否则你有一个悬挂指针,即指向已经释放空间的指针)。因此,从其他任何位置释放指针(除了函数外)是完美的(也是必要的)。
此外,您的流程退出后,您没有内存泄漏,如您所述。发生内存泄漏内部进程;这意味着该进程的一些堆被分配,但不再使用(并且没有引用它,所以它不能再被释放)。当你的程序在堆上占用大量空间时,这可能会导致内存不足问题(并且它对性能不利,所以你不希望发生这种情况)。 但是当你的进程退出时,它的内存(包括他堆)的全部无论如何都被操作系统解除分配。所以,没有内存泄漏了(除非你正在处理多线程,但这是一个不同的话题)。
谢谢你的一个很好的解释!你是对的,我还没有完全理解它是如何工作的,但我觉得我现在理解我多一点:) – user16655 2014-11-21 20:43:43
我经常很高兴,如果我可以让我的代码遵循此模式:
char * foo_allocate() {
char * s = malloc(10);
snprintf(s, 10, "hello");
return s;
}
void foo_release(char *s) {
free(s);
}
您必须释放缓冲区,当你不需要它的内容了,而不是之前。
你的模式是这样的:
char *SomeFunction()
{
...
return malloc(somelength) ;
}
...
char *mychar = SomeFunction() ;
... // deal with the mychar buffer
free(mychar);
...
这真的dosnt不管你在哪里释放你分配的内存,只要你不要忘了释放它。在我看来,把free()的最好的地方放在函数返回之前,就是一个名为cleanup的标签。 这样,你就不会有内存泄漏,因为如果你确信在每一个没有内存泄漏的函数中,你的整个程序都不会有内存泄漏。
你的职能应该somethinhg这样的:
int func(void)
{
/* Code that has allocations in it */
cleanup:
/* Here you should free all of your allocations */
return 0;
}
如果你使用Linux,你可以使用valgrind,以确保你没有任何内存泄漏。
没有关于这个问题很多的选择,这里有一些解决方案:
1-使用函数来分配,另一个是免费为比尔·林奇在后他的回答。当你使用具有良好实践的结构(你创建了一个构造函数和一个析构函数)时,这是正常使用的。
2-使用函数的人负责释放返回的字符串。
3 - 你可以通过返回值作为参数,这里有一个例子:
void foo(char* s) {
snprintf(s, 10, "hello");
}
请注意,最后的解决方案是经常使用,当你想要返回的退出代码说,一切都写(你会发现许多使用这个功能)。
int foo(char* s) {
snprintf(s, 10, "hello");
return 1; // everything went well
}
此类用户提供的缓冲区通常是灾难收据。更好地返回一个合适的'malloc()'ed缓冲区 – cmaster 2014-11-21 20:18:45
在使用分配内存的最高级别函数中,请调用free()
来释放内存。
释放后,将值设置为NULL
确保后续使用s
不使用已释放的内存。如果随后没有访问该变量,那么不需要的编译器可能会优化出不需要的编译器s = NULL;
。
char *Allocator() {
...
char *s = malloc(...);
...
return s;
}
void foo() {
...
char *s = Allocator;
// ... use s
free(s);
s = NULL;
...
}
- 1. 正确的方法返回数组
- 2. free-jqgrid:getLocalRow在free中返回false -jqgrid4.13.6
- 3. 什么是使用NSURLConnection返回数据的正确方法?
- 4. 将方法置于“返回”中,使用Java,是否正确?
- 5. 使用jQuery的正确方法index(); ?它总是返回-1
- 6. 正确的Mockito使用时磕碰的方法有返回值
- 7. 方法不正确地返回图像对象c#.Net
- 8. C#方法,返回
- 9. C#方法返回
- 10. 在C++中使用正确的方法
- 11. 无法使数组正确返回
- 12. 模拟(使用moq)返回模拟对象的方法的正确方法?
- 13. 用指针返回函数值的正确方法
- 14. 在getter中返回字符串引用的正确方法
- 15. 从C#传递参数到C++ Dll并返回的正确方法是什么?
- 16. 正确使用updateOrCreate方法
- 17. 如何正确地返回的std :: string(或如何正确使用返回值)
- 18. C#方法返回公式
- 19. C#返回从方法
- 20. C++方法返回0
- 21. 从方法/函数C返回数组的正确语法是什么#
- 22. 如何正确使用`render`返回`:DoubleRenderError
- 23. 从返回int的函数中获取char的正确方法?
- 24. C#linq groupby返回不正确的组
- 25. C++ SIN()返回不正确的结果
- 26. C++返回的数组值不正确
- 27. const正确性和返回值 - C++
- 28. 正确的答案在返回之前,返回不正确
- 29. 为什么使用通用类型的泛型返回方法不正确?
- 30. 什么是比较函数返回的正确方法
接收指针的代码应该释放某处的内存。当你完成它的时候,简单地释放内存。 – 2014-11-21 20:00:50
如果你的函数正在分配内存,填充一些有用的东西并返回指针,应该记录下来,指针应该被调用代码释放。 – 2014-11-21 20:02:09
当你不再使用它时,你应该释放它。 – anothertest 2014-11-21 20:02:50