【问题标题】:Memory management in asynchronous C++ code异步 C++ 代码中的内存管理
【发布时间】:2014-07-02 12:10:34
【问题描述】:

我已经使用boost::asio 有一段时间了,虽然我确实理解异步调用的概念,但我仍然对内存管理的含义感到有些困惑。在普通的同步代码中,对象的生命周期是明确的。但是考虑一个类似于daytime server 的场景:

可能有多个活动连接已被accepted。现在,每个连接都从套接字发送和接收一些数据,在内部做一些工作,然后决定关闭连接。可以安全地假设与连接相关的数据在处理过程中需要保持可访问性,但是一旦连接关闭,内存就可以被释放。但是我怎样才能正确地实现数据的创建/销毁呢?假设我使用classes 并将回调绑定到成员函数,我应该使用new 创建一个类并在处理完成后立即调用delete this; 还是有更好的方法?

【问题讨论】:

标签: c++ memory-management boost-asio


【解决方案1】:

但是如何正确实现数据的创建/销毁呢?

使用shared_ptr

假设我使用类并将回调绑定到成员函数,我应该使用 new 创建一个类并调用 delete this;处理完成后还是有更好的方法?

让你的类从enable_shared_from_this继承,使用make_shared创建你的类的实例,当你绑定你的回调时,将它们绑定到shared_from_this()而不是this。当您的实例超出最后需要的范围时,将自动销毁您的实例。

【讨论】:

  • 请注意:只有 boost::bind 可与 boost::shared_ptr AFAIK 一起使用(尽管您可以使用保持 shared_from_this() 值的 lambda 实现相同的效果)
  • 嗯,它似乎也适用于普通的std::bind。感谢您指出这一点,变化非常微妙。
  • 想到另一个问题:如果我在堆栈上的对象上使用shared_from_this() 函数会发生什么?当指针被销​​毁时,这会导致段错误吗?
  • shared_from_this() 旨在获取已拥有this 实例的shared_ptr 的副本,如果您的实例不属于shared_ptr,请不要使用它,AFAIK 的确切行为没有真正定义。
  • 嗯,这几乎意味着我必须把所有东西都放在堆里,不是吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2011-03-13
  • 2013-11-30
  • 1970-01-01
  • 2011-07-16
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多