gpt4 book ai didi

c++ - C++ 代码崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 16:25:12 24 4
gpt4 key购买 nike

我试图递归地列出目录中的所有文件。但是我的代码崩溃了,没有给出任何错误。当给定的文件是目录时,我递归地调用函数或者打印它的名字。

我正在使用 dirent.h

int list_file(string path)
{
DIR *dir;
struct dirent *ent;
char *c_style_path;
c_style_path = new char[path.length()];
c_style_path = (char *)path.c_str();
dir = opendir (c_style_path);
if (dir != NULL) {

/* print all the files and directories within directory */
while ((ent = readdir (dir)) != NULL) {
if(ent->d_type == DT_DIR && (strcmp(ent->d_name,".")!=0) && (strcmp(ent->d_name,"..")!=0))
{
string tmp = path + "\\" + ent->d_name;
list_file(tmp);
}
else
{
cout<<ent->d_name<<endl;
}
}
closedir (dir);
} else {
/* could not open directory */
perror ("");
return EXIT_FAILURE;
}
delete [] c_style_path;
return 0;
}

我不知道我在这里做错了什么。有什么线索吗?

最佳答案

这是原因:

c_style_path = (char *)path.c_str();
//...
delete[] c_style_path;

因为它是 delete[]ing 内存,所以当 path 在函数末尾超出范围时,它不应该并且可能导致双重释放。

当您需要 const char* 时,只需使用 path.c_str():

dir = opendir (path.c_str());  

请注意,存储 std::string::c_str() 返回的指针非常危险,因为如果 std::string 很容易导致悬空指针> 实例超出范围。

关于c++ - C++ 代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12687880/

24 4 0
文章推荐: HTML 适合其内容的高度