C内存管理初学者问题

3 c memory-management

好的,我有这段代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我只想知道管理内存有什么问题,因为valgrind会报告内存错误.我认为它是makedna中的dna var,但我什么时候应该释放它?离开功能后我无法访问它,我需要将其返回,所以在此之前我无法释放它.

编辑:好的,谢谢大家.

Vij*_*hew 9

最简单的解决方法是更改​​makeguy(),如下所示:

char* dna = makedna();
strcpy(guy->dna, dna);
free(dna);
Run Code Online (Sandbox Code Playgroud)

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

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

你可以像这样调用makedna():

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

现在makedna()只做预期的事情:做一个dna序列.内存管理应由呼叫者处理.此外,如果在不同的呼叫站点需要,该解决方案提供了使用静态字符串阵列的灵活性.

  • 请注意,即使调用者也不需要分配内存,因为已经分配了guy-> dna.你还有strcpy和null终止问题. (2认同)

Chr*_*ung 7

你应该做这个:

char *tempdna = makedna();
strcpy(guy->dna, tempdna);
free(tempdna);
Run Code Online (Sandbox Code Playgroud)

但是为了strcpy工作,你的makedna函数需要对字符串进行零终止.最后,在返回之前,有:

dna[DNALEN] = 0;
Run Code Online (Sandbox Code Playgroud)

  • 咦?这正是他的`dna [DNALEN] = 0;`行正在做的事情 (2认同)