boost :: filesystem ::在linux上存在segfault

时间:2016-08-06 18:28:33

标签: c++ boost segmentation-fault filesystems

我的Kubuntu上的函数boost :: filesystem :: exists()段错误,我不知道为什么。

这是我的功能:

if (!boost::filesystem::exists("./sthg"))
{
  // ....
}

我用valgrind检查,他告诉我错误是在xstat.c:35中,错误是“Syscall param(file_name)包含未初始化的字节。”

这是我的编译行:

g++ ... -o ... -lboost_system -lboost_filesystem

编辑1:

调用创建目录的函数的函数:

void TCPConnection::enable(void)
{
    try {
        StaticTools::CreateFolder("./clients");
    } catch (std::exception const& e) {
        std::cerr << e.what() << std::endl;
    }
}

创建目录的函数:

void StaticTools::CreateFolder(std::string const& path)
{
    if (!boost::filesystem::exists(path)) {                                                                                                                         
       if (!boost::filesystem::create_directory(path)) {
          throw (std::runtime_error("..."));
       }
    }                                                                                                                                                                     
}

Valgrind日志: http://pastebin.com/gbzFDDNg

1 个答案:

答案 0 :(得分:1)

1)如果boost :: filesystem的文档非常不清楚意味着我认为这意味着什么,那么创建目录的函数应该只是阅读

void StaticTools::CreateFolder(std::string const& path)
{
    boost::filesystem::create_directory(path);
}

因为,如果create_directory返回而没有抛出异常,那么该目录确实存在。 (返回值仅告诉您目录是否刚刚创建是否已存在为目录。您可能不在乎。)

2)如果对此功能的调用确实是

    StaticTools::CreateFolder("./clients");

使用字符串文字&#34; ./ clients&#34;作为参数,&#34; Syscall param stat(file_name)包含未初始化的字节&#34;确实真的是valgrind发出的第一个错误,然后,我遗憾地说,你可能会遇到与C ++运行时库不一致的不幸情况。具体来说,我认为您的libstdc++.so可能默认为C ++ 11 std::string,而您的libboost_filesystem.so期待C ++ 98 std::string,反之亦然。没有好办法解决这个问题;负责boost和/或C ++运行时的Kubuntu人员必须这样做。努力最少的路径可能就是停止使用boost。那不是开玩笑。