gpt4 book ai didi

C - 释放字符串太快而失去值(value)?

转载 作者:行者123 更新时间:2023-11-30 20:53:41 26 4
gpt4 key购买 nike

正在开发递归文件目录浏览器。到目前为止,代码一切正常,但我要实现 0 内存泄漏,并且当我 free() 它时,我的 path 字符串会导致问题。到目前为止,我已经注释掉了 free(),因为它是这样工作的。但是,如果我取消注释 free(),程序将无法正常运行,因为当它开始递归时,它不再有 path 值可供使用。

有什么帮助吗?这是代码:

void buildTree() {
DIR *d;
struct dirent *dir;
d = opendir(front->info);
int root = 1;
if (d) {
while ((dir = readdir(d)) != NULL) {
char *path = (char *) malloc(2+strlen(front->info) + strlen(dir->d_name));
if (dir->d_type == DT_DIR) {
if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
continue;
strcpy(path, front->info);
strcat(path, "/");
strcat(path, dir->d_name);
printf("%d:%d:%s\n",level,root,path);
enq(path);
} else {
strcpy(path, front->info);
strcat(path, "/");
strcat(path, dir->d_name);
printf("%d:%d:%s\n",level,root,path);
}
root++;
//free(path);
}
closedir(d);
}
level++;
deq();
if (front != NULL)
buildTree();
}

最佳答案

您应该向代码添加注释,以便其易于理解。无法知道您期望 enq(path) 做什么。

当您将信息从一个函数传递到另一个函数,并且接收函数要将信息放在某个地方以便稍后使用时,您有两种选择。

接收函数可以为自己制作信息的副本并管理该副本的生命周期。在这种情况下,调用函数可以使用静态缓冲区或在调用接收函数后释放其副本。

或者接收函数可以取得信息的所有权。在这种情况下,调用函数必须动态分配保存信息的内存,并且不得释放它。接收函数及其关联函数有责任在处理完信息后释放内存。

如果您的 enq 函数遵循“取得所有权”模式,那么您删除对 free 的调用是正确的 - 您不应该 free 某个其他代码拥有所有权的缓冲区。 (尽管您应该在 else 路径中调用 free,因为 enq 不获取所有权。)您应该确保某处的其他代码确实这样做在稍后不再需要的时候释放该缓冲区。

关于C - 释放字符串太快而失去值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com