我的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
答案 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。那不是开玩笑。