私のKubuntuにboost :: filesystem :: exists()segfault関数があり、その理由がわかりません。ここでboost :: filesystem :: exists segfault on linux
は私の関数である。
if (!boost::filesystem::exists("./sthg"))
{
// ....
}
私はvalgrindのを確認し、彼はエラーがxstat.cである私に語った:35とエラーがシステムコールのparam(file_nameが)初期化されていないバイト(複数可)を含んでいる」です。 "ここで
は私のコンパイル行です:
g++ ... -o ... -lboost_system -lboost_filesystem
EDIT 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
最も可能性の高い説明は、あなたが実際に 'boost :: filesystem :: exists'に渡した文字列が無効であったということです。 2番目の可能性が高いのは、Boostのインストールが自己矛盾しているか、コアC++ランタイムライブラリと矛盾しているということです。これら2つのうちどれがどれであるかを理解するために、単なる断片ではなく、[最小、完全な例(https://stackoverflow.com/help/mcve)]を提供してください。 – zwol
あなたが私たちに教えてくれる他のもの: 'dpkg-query -W -f 'の$ {db:Status-Abbrev} $ {Version} $ {Package} \ n' g ++ * libstdC++ *ブースト* libboost * | grep '^ ii' |列-t ';パッケージマネージャを介さずに手動でソフトウェアをインストールしているか(特にブーストかコンパイラか) 'valgrind'から得た完全なスタックトレースです。 – zwol
ところで、ファイルが存在するかどうかをチェックするのはほとんどの場合間違いです。チェックに基づいて実行するチェックとアクションの間に、他のプログラムがファイルを作成または削除したり、小切手代わりに、ファイルを使ってやりたいことを行い、そのファイルがあるかどうかを確認してください。 (システムプリミティブ['open'](http://linux.die.net/man/3/open)にはこれに非常に便利なオプション' O_EXCL'がありますが、残念ながらstdioとiostreamsはそのオプションを公開していません)。 – zwol