1


我正在编写一个使用该dirent.h库的 C++ 应用程序,以从目录中读取文件。有一次我想在文件和目录之间做出决定。为此,我添加了以下代码:

entry = readdir(used_directory); //read next object from directory stream
DIR* directory_test = opendir((path + entry->d_name).c_str()); //try to open object as directory
if ( directory_test != nullptr) { //object is directory
    if (entry != nullptr) { //reading from directory succeeded
        dirs.push_back(entry->d_name); //add filename to file list
        ++dircounter;
    }
}
else { //object is file

path是类型,string条目是类型dirent *
有了这个,程序会导致内存访问错误,没有它不会。
我想通了,该错误是由

(path + entry->d_name)

但这不是string语句中的隐式转换,因为其他测试也喜欢cout << entry->d_name;path += entry->d_name失败并出现相同的错误。所以显然使用entry->d_nameas是失败的char *,尽管它是这样定义的(在 dirent.h 的文档中)。
为什么会发生这种故障?

编辑
稍后在我添加entry->d_name到 a的程序中vector<string>,这不会导致任何问题。

4

1 回答 1

2

失败是在检查它是否等于之前访问条目nullptr
因为如果 entry 等于nullptr,我的遍历目录的循环就会停止,所以最后一次迭代会导致错误。

于 2015-05-09T14:31:40.347 回答