boost::filesystem::create_directory threw a boost::filesystem::filesystem_error: Bad address

boost::filesystem::create_directory threw a boost::filesystem::filesystem_error: Bad address

我的代码的 TL;DR 如下:

server::server(boost::filesystem::path mappath) : mappath(mappath) {
    if(boost::filesystem::is_directory(mappath) && boost::filesystem::exists(mappath)) {
        // Do some stuff here
    } else {
        boost::filesystem::create_directory(mappath);
    }
}

代码在 mappath 存在时有效(几乎没有,因为我发现 Boost 几乎在每个函数中都存在段错误)。
但是,如果没有,它会抛出消息 "Bad address".
的异常 当我通过 std::cout 打印 mappath 时,它 returns:

"/home/myusername/.testfolder/huni/ENTER YOUR TEXT HERE"

哪个是正确的。

请注意,当我尝试打印 mappath inside else 语句时,它会出现段错误。
我推断 is_directoryexists 中的 mappath 有问题,因为在 之前 打印 if 时没有错误]声明。

我给自己写了一个MCVE。当路径不存在时,boost 抛出

terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
  what():  boost::filesystem::create_directory: No such file or directory
Aborted (core dumped)

因为您的程序首先检查路径是否为目录,然后检查路径是否存在(正确)。

当路径存在且为目录时,程序运行无输出,什么都不做(正确)。

当路径存在且为文件时,boost抛出

terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
  what():  boost::filesystem::create_directory: File exists
Aborted (core dumped)

因为它无法创建目录(正确)。

因此您的代码段完成了它应该做的事情。也许您应该更改 if 语句中的顺序并在 else:

中添加一个支票
#include <boost/filesystem.hpp>
#include <iostream>

class server {
public:
  server(boost::filesystem::path mappath) : mappath(mappath) {
    if(boost::filesystem::exists(mappath) && boost::filesystem::is_directory(mappath)) {
        // Do some stuff here
    } else if (!boost::filesystem::exists(mappath)) {
        boost::filesystem::create_directory(mappath);
    }
  }
private:
  boost::filesystem::path mappath;
};

int main() {
  server s("/path/test");
  return 0;
}

现在程序检查路径是否存在。如果路径存在,程序将检查路径是否为目录。如果路径不存在,则创建目录。

原来 Bad address 是 POSIX 特定的错误。

另外,我无法在 if 语句的 else 子句中打印 mappath 的原因是 is_directory 弄乱了引用。
它实际上在做什么我无法弄清楚。

所以,我已经从 Boost 切换到实际有效的东西。