我有一个包含协程方法的类。如果协程被执行并在暂停状态下等待,则对象可能会被删除。在某些时候协程将在它的类被删除时恢复。
在传统的异步代码中,我使用一些钩子(如
callback_hook on_something(std::function<void(int)> callback)
)制作方法,并且 callback_hook 是一个 RAII 对象,其生命周期与回调耦合。因此,如果回调接收器被删除并且可以删除回调,我会收到通知。
但是我没有看到任何可能的协程解决方案。我不知道我是否可以安全地删除具有一些可等待方法的对象。
参见示例:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
struct destroy_test {
int something {0};
~destroy_test() {
std::cout << "destroy_test destructor\n";
}
boost::asio::awaitable<void> foo(boost::asio::any_io_executor ioc) {
std::cout << "now accessing deleted data...\n";
something = 3; // Error
co_return;
}
};
int main() {
boost::asio::io_context io;
destroy_test *dt = new destroy_test();
boost::asio::co_spawn(io, [dt]() -> boost::asio::awaitable<void> { delete dt; co_return; }, [](std::exception_ptr e) {});
boost::asio::co_spawn(io, dt->foo(io.get_executor()), [](std::exception_ptr e) {});
io.run();
}