好的,我有这 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/