我(尝试?)返回在函数内分配的内存。
假设我在这里写的没有明显的问题(并且没有测试),内存是如何被释放的?我之后需要free(bob)
,因为他在堆上而不是堆栈,对吧?
我在another accepted answer just now中读到了关于C中引用计数的内容,但我真的不记得C有什么像垃圾收集器一样。
char* strCat5000(char *fmt, ...)
{
char buff[5000];
char *ret_;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buff, sizeof(buff), fmt, arg_ptr);
va_end(arg_ptr);
//ret_ = malloc((char*)(strlen(buff)+1)*sizeof(char)); //Allocated inside function
ret_ = (char*)malloc((strlen(buff)+1)*sizeof(char)); //moved (char*) .. typo
ret_ = strcpy(ret_,buff);
return (ret_);
}
...
void findBob()
{
char * bob;
bob = strCat1000("Server is %s for %d seconds.", "on fire", 35329);
printf("%s", bob);
free(bob); //bob needs to be freed here or he'll leak when findBob ends???
}
答案 0 :(得分:1)
是。你必须在findBob()方法中“释放Bob”,否则你的程序中将没有进一步的特定内存概念=>你会有泄漏。所以,简而言之:是的,必须释放内存。
然而,只是旁注:这种代码非常“容易出错”。如果你有一个函数分配调用者应该释放的内存,那么使用freeBob()
方法或类似方法可能是个好主意,这使得这个目的非常明显。在相同的抽象级别进行malloc()
和free()
调用通常是个好主意。例如。在这种情况下,同一.c文件中的两个函数可能是一个合理的“抽象级别”。
答案 1 :(得分:1)
你是对的,如果从函数返回堆分配的数据,它最终需要被释放(除非你需要它直到程序完成,然后你可以依赖于所有内存在释放时释放的事实流程退出)。
引用计数是一种用于避免过早释放内存的技术。如果您可以将指针复制到多个变量中,则不希望在任何变量仍在使用它时将其释放。您分配包含refcount
成员的结构。每次将指针指定给另一个变量时,必须递增引用计数,并减少该变量指向之前的引用的引用计数。当引用计数降至0时,您可以调用free()
。
答案 2 :(得分:1)
要处理上述问题,您有两种方法。
第一个是你正在做的事情,即free
使用后的bob。因为c中没有automatic
。
第二,您可以将parameter
传递给要存储结果的strCat1000
(假设为store_var
)。在这种情况下,store_var
将在堆栈上(必须在findBob
内声明),并且在findBob
结束后将自动解除分配。
如果您希望免于free
,请将您的代码免费提供给malloc
。
这样的事情可行:
void findBob()
{
char store_var[1000];
strCat1000(store_var,"Server is %s for %d seconds.", "on fire", 35329);
...
void strCat1000(char to_save[],char *fmt, ...)
{
ret_ = strcpy(to_save,buff); //check for lengths also.
...
答案 3 :(得分:0)
为了使它变得非常简单,我写下了以下代码的和平(c ++)。只需运行它并使用任务管理器监控代码内存使用情况。
#include "stdafx.h"
#include<iostream>
#include <conio.h>
using namespace std;
int * allocate(unsigned size)
{
int * arr = new int[size];
for(unsigned i=0;i<size;i++)
arr[i] = i;
return arr;
}
int main()
{
int * p;
p = allocate(1000000);
getch(); // Here you still occupy the memory
free(p); // here you free the memory you occupy in the function
getch(); // here you should see that memory is freed before returning from the main
return 0;
}