好的,我有这段代码:
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,但我什么时候应该释放它?离开功能后我无法访问它,我需要将其返回,所以在此之前我无法释放它.
编辑:好的,谢谢大家.
最简单的解决方法是更改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序列.内存管理应由呼叫者处理.此外,如果在不同的呼叫站点需要,该解决方案提供了使用静态字符串阵列的灵活性.
你应该做这个:
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)