使用std :: bind结构构造std :: function时出现堆栈溢出

时间:2013-12-18 16:34:10

标签: c++ c++11 std-function stdbind

#include <stdio.h>
#include <functional>

void foo(int a, int b)
{
    printf("%d %d\n", a, b);
}

int main()
{
    using namespace std::placeholders;
    auto f1 = std::bind(foo, 10, _1); // fine
    std::function<void (int)> f2 = f1; // fine
    auto f3 = std::bind(f2, 20); // fine
    std::function<void ()> f4 = f3; // stack overflow
    std::function<void ()> f5 = [=](){f3();}; // stack overflow
    f3();
    return 0;
}

我正在编写一个简单的库,并使用std::function作为库用户的回调。

我希望像f4这样的东西来简化回调函数。

我不熟悉std::bind内幕。

为什么f3无法构建f4

我正在使用

clang ++:Apple LLVM 5.0版(clang-500.2.79)(基于LLVM 3.3svn)

在OSX10.9 macbook上

编译:

clang ++ -g -std = c ++ 0x test.cpp

在f4处堆栈溢出因为流动事物的无限调用:

frame #0: 
frame #1:
...

frame #6361: 0x0000000100001ff2 a.out`std::__1::function<void ()>::function<std::__1::__bind<std::__1::function<void (int)>&, int> >(std::__1::__bind<std::__1::function<void (int)>&, int>, std::__1::enable_if<__callable<std::__1::__bind<std::__1::function<void (int)>&, int> >::value, void>::type*) [inlined] std::__1::unique_ptr<std::__1::__function::__base<void (this=0x00007fff5fbfeb00, this=0x0000000100103a90, __f=0x00007fff5fbff4e0, __a=0x00007fff5fbfeae8)>, std::__1::__allocator_destructor<std::__1::allocator<std::__1::__function::__func<std::__1::__bind<std::__1::function<void (int)>&, int>, std::__1::allocator<std::__1::__bind<std::__1::function<void (int)>&, int> >, void ()> > > >::get() const + 42 at functional:1007

frame #6362: 0x0000000100001fc8 a.out`std::__1::function<void (this=0x00007fff5fbff530, __f=0x00007fff5fbff4e0, =0x0000000000000000)>::function<std::__1::__bind<std::__1::function<void (int)>&, int> >(std::__1::__bind<std::__1::function<void (int)>&, int>, std::__1::enable_if<__callable<std::__1::__bind<std::__1::function<void (int)>&, int> >::value, void>::type*) + 776 at functional:1285

frame #6363: 0x0000000100001a3d a.out`std::__1::function<void (this=0x00007fff5fbff530, __f=<unavailable>, =0x0000000000000000)>::function<std::__1::__bind<std::__1::function<void (int)>&, int> >(std::__1::__bind<std::__1::function<void (int)>&, int>, std::__1::enable_if<__callable<std::__1::__bind<std::__1::function<void (int)>&, int> >::value, void>::type*) + 29 at functional:1289

frame #6364: 0x000000010000189c a.out`main + 956 at test.cpp:15

1 个答案:

答案 0 :(得分:2)

这是libc ++中的一个错误。它已被修复。如果您没有使用最新版本的Xcode,请更新。如果您使用的是最新版本的Xcode,可以在这里找到最新的libc ++:http://libcxx.llvm.org。这个错误肯定在svn存储库中修复。