2013-12-19 19 views
5

このコードがクラッシュするのはなぜですか?C++ 11:std :: bindがラムダでクラッシュする

#include <iostream> 
#include <functional> 

int main(int argc, const char * argv[]) 
{ 
    std::function<void(int)> function = [](int) 
    { 
    }; 
    auto binding = std::bind(function, 10); 

    std::function<void()> jobFunctor = binding; // crashes here with EXC_BAD_ACCESS 

    return 0; 
} 

jobFunctorに結合の結果を変換する場合std::functionコンストラクタにおける無限スタック再帰があります。

私は、私はlibcの++を使用してXcodeの5.0.2でこのコードをコンパイルし、コンパイラのバージョンのMac OS X 10.8.5を実行している:私はこのコードが動作する必要があることをかなり確信している、とすることを

LO50F-04-198BX:$ clang++ --version 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin12.5.0 
Thread model: posix 
+0

gcc 4.8でクラッシュせず、Linuxではclang 3.4、Windowsではgcc 4.8.1をクラッシュさせません。 – Rapptz

+0

これはOS X 10.9.1でもクラッシュします。この場合、セグメンテーションフォルトは、std :: bind内の無限回数の再帰的な関数呼び出しでスタックをオーバーフローさせるためです。 –

+0

それは正常に動作するはずです:http://ideone.com/GXGIBx – Snps

答えて

6

をlibC++の実装上の欠陥です。

私はあなたのためにバグレポートをlibC++バグトラッカーに掲載しました。 http://llvm.org/bugs/show_bug.cgi?id=18282

編集: Caseyが指摘したように、これはすでにlibC++で修正されています。今度はアップルがXCode/OS Xの次期バージョンでlibC++のアップデート版をリリースするのを待つだけです。

+0

http:// llvmのようなものです。 org/bugs/show_bug.cgi?id = 16385 – Casey

+0

@Casey:あなたは正しいと思います。悲しいことに、私の検索は何もなかった。 –

+0

@Casey:特にそのバグに関連するテストケースを見ると、同じことを指していることは明らかです。 [追加したテストケースはここにあります](http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/function.objects/bind/func.bind/func.bind.bind/ copy.pass.cpp?view =マークアップ&パスレブ= 185297)。 –

関連する問題