C++11: std::bind与lambda表达式一起使用导致崩溃

5
为什么这段代码会崩溃?
#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,使用libc++和Xcode 5.0.2编译此代码,编译器版本:

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

在Linux上,不会在gcc 4.8和clang 3.4上崩溃,也不会在Windows上的gcc 4.8.1上崩溃。 - Rapptz
这个问题在OS X 10.9.1下也会崩溃。在这种情况下,由于std::bind中无限递归函数调用导致堆栈溢出而出现分段错误。 - Bill Lynch
1
看起来是编译器的错误。 - David
实际上,即使没有最后一行代码,它也会崩溃,即在执行bind行时崩溃。与Piotr相同的编译器,但目标是x86_64-apple-darwin13.0.0。 - blackbird
@Yakk 请随意编译该代码并查看回溯信息,然后再说一遍 ;) - marko
显示剩余2条评论
1个回答

6
我相当确定这段代码应该可以工作,并且是libc++实现中的缺陷。
我已经为您在libc++ bug跟踪器上发布了一个错误报告:http://llvm.org/bugs/show_bug.cgi?id=18282 编辑:正如Casey所指出的那样,这个问题已经在libc++中得到解决。现在您只需要等待苹果在某个即将发布的XCode / OS X版本中发布更新版本的libc++。

@Casey:我认为你是正确的。可惜,我的搜索没有找到任何结果。 - Bill Lynch
@Casey:特别是当你看到与该错误相关的测试用例时,很明显他们指的是同一件事情。他们添加的测试用例可以在这里找到 - Bill Lynch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接