C中的引用计数和函数内部分配的内存

时间:2013-10-12 18:33:09

标签: c function gcc return malloc

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

假设我在这里写的没有明显的问题(并且没有测试),内存是如何被释放的?我之后需要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???
}

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

Wikipedia

答案 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;
}