C内存管理初学者题

标签 c memory-management

好的,我有这 block code :

typedef struct faux_crit
{
  char dna[DNALEN+1]; //#define'd to 16
  int x, y;
  int age;
  int p;
  int dir;
} crit;

crit *makeguy(int x, int y)
{
  crit *guy;
  guy = (crit *) malloc(sizeof(crit));
  strcpy(guy->dna, makedna());
  guy->x = x;
  guy->y = y;
  guy->age = guy->p = guy->dir = 0;
  return guy;
}

char *makedna()
{
  char *dna;
  int i;
  dna = (char *) malloc(sizeof(char) * DNALEN+1);
  for(i = 0; i < DNALEN; i++)
    dna[i] = randchar();
  return dna;
}

int main()
{
  int i;
  crit *newguy;
  srand((unsigned) time(0));

  newguy = makeguy(0, 0);
  /*[..]
   just printing things here
   */
  free(newguy);

  return 0;
}

我只是想知道我在管理内存方面出了什么问题,因为 valgrind 报告内存错误。我假设它是 makedna 中的 dna var,但我应该什么时候释放它?离开函数后我无法访问它,我需要返回它,所以我不能在此之前释放它。

编辑:好的,谢谢大家。

最佳答案

最简单的解决方法是像这样更改 makeguy():

char* dna = makedna();
strcpy(guy->dna, dna);
free(dna);

但这不是一个好的解决方案,因为您在一个位置分配内存并在其他位置释放它。最好在同一个地方执行 malloc 和 free。所以我建议将 makedna() 更改为:

void* makedna(char* dna, int dna_len)
{
  int i;
  for(i = 0; i < dna_len; i++)
    dna[i] = randchar();
}

您可以这样调用 makedna():

char* dna = (char*)malloc(DNALEN+1);
makedna(dna, DNALEN);
dna[DNALEN] = 0;
strcpy(guy->dna, dna);
free(dna);

现在 makedna() 只做预期做的事情:制作 dna 序列。调用者应负责内存管理。此外,此解决方案提供了使用静态字符数组的灵 active ,如果在不同的调用站点需要的话。

关于C内存管理初学者题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1318877/

相关文章:

c - 在C中添加unsigned long和int

c - 为什么需要左值作为增量操作数?

c++ - 任何更快/可靠地分配多个小块而不是 1 个大块

Java - 在另一个方法中使用返回值作为参数 - 内存管理

python - 随着时间的推移增加 python 进程内存

c - 为什么我的递归函数会导致段错误?

c - 在 C 中使用正则表达式声明指针

C 中的卷积边缘检测

objective-c - 你能帮我理解添加到容器(NSDictionary、NSArray)时的 block 类型吗?

iphone - iOS 一个方法返回值的正确方式(内存管理)