【发布时间】:2020-04-22 08:15:13
【问题描述】:
在下面的代码中,我们正在创建一个对象,绑定一个函数并在删除对象之后调用它。
这显然会导致分段错误,因为删除后使用了底层对象。
在为异步数据提供回调的库的上下文中,我们应该如何防止回调函数指向nullptr?
您可以在 cpp.sh/5ubbg 进行测试
#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)
【问题讨论】: