如何删除绑定函数时如何安全地使用回调函数

问题描述 投票:0回答:1

在下面的代码中,我们正在创建一个对象,绑定一个函数,然后在删除该对象之后调用它。

[这显然会导致分段错误,因为删除后使用了基础对象。

在提供异步数据回调的库的上下文中,我们应该如何防止回调函数指向nullptr

#include <memory>
#include <functional>
#include <iostream>

class CallbackContainer {
 public:
  std::string data_;
  CallbackContainer(std::string data): data_(data) {}
  ~CallbackContainer() {}
  void rawTest(const std::string& some_data);
};

void CallbackContainer::rawTest(const std::string& some_data) {
  std::cout << data_ << " " << some_data << std::endl;
}

int main(int /* argc */, char const** /* argv */) {
  std::unique_ptr<CallbackContainer> container;
  container.reset(new CallbackContainer("Internal data"));

  auto callback = std::bind(&CallbackContainer::rawTest, container.get(), std::placeholders::_1);
  callback("Before");
  std::cout << &callback << std::endl;
  container.reset();
  std::cout << &callback << std::endl;
  callback("After");
  return 0;
}

返回:

> Internal data Before 
> 0x7178a3bf6570 
> 0x7178a3bf6570 
> Error launching program (Segmentation fault)
c++ c++11 callback
1个回答
0
投票

我在使用boost asio时遇到了同样的问题。然后,我开始使用shared_ptr进行传递,并用于将shared_ptr传递给bind。除非并且直到std::function被重新分配给其他对象,否则该对象将保持活动状态。

std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>();
auto func = std::bind(&MyClass::MyMemFunc, this, ptr);
ptr.reset();
© www.soinside.com 2019 - 2024. All rights reserved.