2013-12-19 106 views
5

爲什麼此代碼崩潰?C++ 11:std :: bind與lambda崩潰

#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構造無限堆棧遞歸。

我運行Mac OS X 10.8.5,我編譯這段代碼的Xcode 5.0.2使用的libC++編譯器的版本:

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

不會在linux上的gcc 4.8和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++ bug跟蹤器上發佈了一個bug報告。 http://llvm.org/bugs/show_bug.cgi?id=18282

編輯:正如凱西指出的,這已經在libC++中得到了修復。現在,您只需等待Apple在即將推出的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?視圖=標記&pathrev = 185297)。 –