CPP怎么管理bind返回的callback的生命周期

#include <functional>
#include <iostream>


class Test
{
public:
      void blah() { std::cout << "BLAH!" << std::endl; }
};


int main()
{
    // store the member function of an object:
    Test test;  
    std::function< void() > callback = std::bind( &Test::blah, test );
    callback();
    // .....
}


上面这段代码里,对象test的一个成员函数被绑定到callback这个std::function对象上,如果我把这个callback存在别处,直到test对象销毁了,调用callback不会coredump么?test 的生命周期是和 callback 绑定的么(这样可以保证callback有效,毕竟是和test的成员函数绑定的)?

阅读 3.9k
1 个回答

std::bind会对入参进行拷贝或者移动
The arguments to bind are copied or moved, and are never passed by reference unless wrapped in std::ref or std::cref.

{
    Test* test = new Test;
    auto callback = std::bind( &Test::blah, test ); // 注意这里是拷贝的test指针,不是test指向的对象.
    delete test;
    callback(); // 可能会coredump,也可能会正确输出,行为是未定义的.
}
{
    Test* test = new Test;
    auto callback = std::bind( &Test::blah, *test ); // 注意这里是拷贝test指向的对象.
    delete test;
    callback(); // 正常输出,因为callback拷贝test指向的对象
}
{
    auto callback = std::bind( &Test::blah, Test() ); // 注意这里是移动
    callback(); // 正常输出
}

如果需要保持Test对象与callback生命周期一致,可以考虑用move(省略一次拷贝开销)或者unique_ptr或者shared_ptr

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏