【问题标题】:C++ shared_ptr std::bind and std::functionC++ shared_ptr std::bind 和 std::function
【发布时间】:2017-08-01 14:40:28
【问题描述】:

我有以下几点:

B 类侦听C 类的boost::signal2,触发时将执行A 类给出的回调,并执行A 类中的方法

ABCD都是std::shared_ptr

问题是当类D 释放指向类B 的指针时,B 并没有因为信号处理程序而被删除。即使我在boost::connection 上调用断开连接,我也会遇到同样的问题。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 你能给我们看一些代码吗?
  • 是的,如果没有足够的代码让人们了解内部发生的事情,这没有任何用处。
  • 我认为您想要的是信号处理程序的std::weak_pointer,但我同意拥有代码会使这更容易理解。
  • 这里有一部分代码可能有用:gist.github.com/bend/c923187223e0ade3117168bee874feea
  • 奇怪的是我没有看到析构函数的任何调用(我在析构函数中放了一个 cout)但我没有看到 valgrind 中的任何对象泄漏......

标签: c++ shared-ptr std-function boost-signals2


【解决方案1】:

所以问题是由于shared_ptr 循环造成的。

A 类传递给 B 类,std::functionshared_ptr 传递给 A 类,因此 A 类永远不会被删除。

例如。 B.route(std::bind(&A::myFunc, shared_from_this()));

我在 A 类中使用 lambda 函数和 weak_ptr 修复了它:

std::weak_ptr<A> wp = shared_from_this();
  A.route(std::bind([wp]() {
   auto p = wp.lock();
   if(wp)
     wp->myFunc();
}));

这样我的函数 myFunc 只有在 A 仍然有效时才会被调用。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2014-01-03
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多