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

C++ linux上存在boost::filesystem::segfault,c++,boost,segmentation-fault,filesystems,C++,Boost,Segmentation Fault,Filesystems,函数boost::filesystem::exists()segfault在我的Kubuntu上,我不知道为什么 以下是我的功能: if (!boost::filesystem::exists("./sthg")) { // .... } 我向valgrind询问,他告诉我错误在xstat.c:35中,错误是“Syscall param(文件名)包含未初始化的字节” 以下是我的汇编行: g++ ... -o ... -lboost_system -lboost_filesystem 编辑

函数boost::filesystem::exists()segfault在我的Kubuntu上,我不知道为什么

以下是我的功能:

if (!boost::filesystem::exists("./sthg"))
{
  // ....
}
我向valgrind询问,他告诉我错误在xstat.c:35中,错误是“Syscall param(文件名)包含未初始化的字节”

以下是我的汇编行:

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("..."));
       }
    }                                                                                                                                                                     
}
Valgrand日志:

1)如果boost::filesystem非常不清楚的文档说明了我认为它的意思,那么创建目录的函数应该只读取

void StaticTools::CreateFolder(std::string const& path)
{
    boost::filesystem::create_directory(path);
}
因为,如果
create\u directory
返回而不引发异常,则该目录确实存在。(返回值只告诉您目录是否刚刚创建,而不是已经作为目录存在。您可能不在乎。)

2) 如果对这个函数的调用真的是

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

以字符串文本“./Cube”为参数,“SysCalPARAM STAT(FielyNoNE)包含未初始化字节(S)”确实是<>代码> Valgnnd所发出的第一个错误,然后,很遗憾地说,您可能处于Boost不符合C++运行库的不幸情况。具体地说,我认为您的

libstdc++。因此
可能默认为C++11
std::string
,而您的
libboost\u文件系统。因此
期望C++98
std::string
,反之亦然。你没有好办法解决这个问题;负责Boost和/或C++运行时的Kubtuu人必须这样做。最省力的方法可能是停止使用boost。这不是开玩笑。

最可能的解释是,您实际传递给
boost::filesystem::exists
的字符串无效。第二种最可能的解释是,您的Boost安装与内核C++运行库无关或不一致。为了帮助我们找出这两者中的哪一个,请提供一个而不仅仅是一个片段。您可以告诉我们的其他有帮助的事情:dpkg query-W-f'${db:Status Abbrev}${Version}${Package}\n'g++*libstdc++*boost*libboost*| grep'^ii'| column-t;是否手动安装了任何软件(尤其是boost或编译器),而不是通过软件包管理器安装;顺便说一下,检查文件是否存在几乎总是一个错误,因为它有一个固有的竞争:在检查和基于检查采取的操作之间,其他一些程序可能会创建或删除文件,从而使检查无效。相反,只需继续对文件执行您想执行的操作,并检查是否失败。(系统原语有一个选项
O_EXCL
,它对此非常有用。不幸的是,stdio和iostreams都没有公开该选项。)感谢您的回答,事实上,我只是删除了exists()验证,它工作得很好,但很奇怪。。。如果您仍然对此问题感兴趣,我将编辑我的问题并添加您询问的日志。-字符串是有效的,我通过复制而不是引用来通过测试-我已经使用apt get install命令安装了boost,对于g++-我的boost::asio工作正常,所以我认为它对安装有好处?请发布导致错误的实际代码。我们在看不到的代码中找不到bug。