代码之家  ›  专栏  ›  技术社区  ›  Programmer

VC++在使用unique_ptr实现回调时报告运行时崩溃

  •  0
  • Programmer  · 技术社区  · 7 年前

    我需要使用另一个类的唯一\u ptr实现回调方法:

    #include <iostream>
    #include <functional>
    #include <memory>
    #include <vector>
    
    class A
    {
    public:
    void Show(std::vector<int> a, int b) {std::cout << "Hello " << " " << b << std::endl;}
    };
    
    class B
    {
    public:
    void SetCB(std::function<void(std::vector<int> ,int)> callb);
    std::function<void(std::vector<int> ,int)> cb;
    };
    
    void B::SetCB(std::function<void(std::vector<int> ,int)> callb)
    {
    cb= callb;
    }
    
    int main()
    {
    std::unique_ptr<A> a1 = std::make_unique<A>();
    std::unique_ptr<B> b1 = std::make_unique<B>();
    b1->SetCB([&](std::vector<int> a, int b){a1->Show(a,b);});
    std::vector<int> y;
    b1->cb(y,4);
    }
    

    我在VC++中遇到了运行时读取访问错误冲突-我们如何使用unique_ptr实现回调,并使用std::bind或其他方式使用一些参数?

    $ c++ -std=c++14 try68.cpp
    
                     ^
    

    无法使用unique_ptr设置回调方法吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Julien Villemure-Fréchette    7 年前

    一句忠告,您应该非常小心地使用捕获 引用局部变量 . 如果您的回调是从 a1 变量(这是main()函数,因此您的示例是正确的),然后是表达式 a1->Show(a,b) a1 是一个 悬挂参考 a1 通过移动:

    b1->SetCB([ptr=std::move(a1)](std::vector<int> a, int b){ptr->Show(a,b);};
    

    然后您的回调函数将获得该对象的所有权 a1 指向。