2

我(尝试?)返回在函数内部分配的内存。

假设我在这里写的(并且没有测试)没有明显的问题,内存是如何释放或不释放的?我需要free(bob)稍后,因为他在堆上而不是在堆栈上,对吧?

我刚才在另一个接受的答案中读到了一些关于 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???
}
4

4 回答 4

1

是的。你必须在 findBob() 方法中“释放 Bob”,否则你的程序中将没有关于该特定内存块的进一步概念 => 你会有泄漏。因此,简而言之:是的,必须释放该内存。

但是,只是一个旁注:这种代码非常“容易出错”。如果你有一个分配内存的函数,调用者应该释放它,那么有一个方法或类似的方法可能是个好主意freeBob(),这使得这个目的非常明显。malloc()让和free()调用发生在同一抽象级别通常是一个好主意。例如,在这种情况下,同一个 .c 文件中的两个函数可能是一个合理的“抽象级别”。

于 2013-10-12T18:39:41.857 回答
1

你是对的,如果你从一个函数返回堆分配的数据,它最终需要被释放(除非你需要它直到程序完成,那么你可以依赖于进程退出时所有内存都被释放的事实) .

引用计数是一种用于避免过早释放内存的技术。如果您可以将指针复制到多个变量中,那么您不希望在其中任何一个仍在使用它时释放它。您分配一个包含refcount成员的结构。每次将指针分配给另一个变量时,都必须增加引用计数,并减少该变量先前指向的引用计数。当 refcount 降至 0 时,您可以调用free().

维基百科

于 2013-10-12T18:41:44.477 回答
1

要处理上述问题,您有两种方法。

第一个是您正在做的事情,即free使用后的鲍勃。因为automaticc中没有任何内容。

第二个是你可以传递parameterstrCat1000你想要存储结果的位置(比如说它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.
  ...
于 2013-10-12T18:43:39.327 回答
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;
}
于 2013-10-12T18:55:02.473 回答