在解构器中调用异步方法后可能会产生什么后果?

时间:2017-05-22 22:24:55

标签: c++ asynchronous xmlhttprequest

我目前正在开发一个需要与远程服务器进行数据同步的游戏项目。这些数据只是游戏状态,如解锁级别或玩家项目。所以我有一个单例对象负责通过使用异步HTTP post请求将本地数据推送到服务器。我无法决定何时调用此方法。

一个想法是在关闭游戏之前发送更新的游戏状态。我正在使用c ++。好吧,我知道解构主不是为了这个,但如果我能在解构器中做到这一点,我可以肯定所有的进展都被推到了服务器上。

但是,我无法猜测在解构器中调用异步方法可能带来的后果。应用程序是否可以保持活动,至少每次响应都会到来?这样的事情真的很糟糕吗?

2 个答案:

答案 0 :(得分:0)

  

应用程序是否可以保持活着状态,至少每次响应都会到来?

没有

  

这样的事情真的很糟糕吗?

在析构函数调用结束时,所有成员都按照与分配相反的顺序取消分配。如果某些东西试图利用这个解除分配的内存(即异步函数),它将导致访问冲突/段错误/未定义的行为,具体取决于您的编译器/ OS /源。

为了保证返回,您需要将异步调用转换为同步调用。通常,如果您的应用程序是多线程的,可以使用锁定/通知模式或简单的线程连接来完成。

答案 1 :(得分:0)

这取决于您的代码的布局方式。

从析构函数调用异步方法没有任何内在错误。如果你想在不同的线程上做某些事情,并且你可以确定该线程不需要被销毁的对象中的任何资源,那就去吧。

问题似乎是你要等待响应,而不是关闭游戏,直到你肯定保存状态已经存在某个地方。如果在发送异步请求后退出main函数,那么这不是一件好事。但是,您可以做的是确保在退出之前连接执行异步请求的线程。

但是,根据您的设计,如果您打算这样做,您可以在程序终止之前打电话保存数据。例如

int main()
{
    Game g;
    //Game loop
    ...

    g.saveState();

    return 0;
}