C++代码崩溃

Crash in C++ Code

本文关键字:崩溃 代码 C++      更新时间:2023-10-16

我正在尝试递归列出目录中的所有文件。但是我的代码崩溃而没有给出任何错误。当给定文件是目录时,我递归调用该函数或以其他方式打印其名称。

我正在使用 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[]内存,它不应该并且可能会导致双释放,当path在函数结束时超出范围时。

只需在需要const char*时使用path.c_str()

dir = opendir (path.c_str());  

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