Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::weak_ptr解决lambda中的循环依赖_C++_C++11_Lambda - Fatal编程技术网

C++ 使用std::weak_ptr解决lambda中的循环依赖

C++ 使用std::weak_ptr解决lambda中的循环依赖,c++,c++11,lambda,C++,C++11,Lambda,假设我们有: class A { void Func(std::function<void(void)> handler); } class B { A myObj; B() { myObj.Func([this]() { //whatever }); } } A类 { void Func(std::函数处理程序); } B类 { myObj; B() { myObj

假设我们有:

class A
{
    void Func(std::function<void(void)> handler);
}

class B
{
    A myObj;

    B()
    {
        myObj.Func([this]()
        {
            //whatever
        });
    }
}
A类
{
void Func(std::函数处理程序);
}
B类
{
myObj;
B()
{
myObj.Func([此]()
{
//随便
});
}
}
这使得myObj(类型A)引用lambda对象,lambda对象引用B对象(通过捕获的“this”),而B对象(捕获的“this”)引用myObj(类型A),这意味着发生了循环依赖,对吗

我知道解决方法在于以某种方式使用std::weak_ptr,但我很难理解如何正确使用它们来解决这个问题。有人能为这个例子提供解决方案吗


谢谢

即使存在循环依赖项,也会删除所有内容,因为简单引用不会阻止任何内容的删除。它们就像你正在谈论的弱点。

你在寻找解决方案的问题是什么?我看不出你的例子有什么不对劲。是的,三个对象都互相引用-这是一个问题,因为…?有一个循环依赖关系。。。正如我在下面的评论中提到的。A->Lambda,Lambda->B,B->A。这意味着A或B不能被破坏。如何解决这个循环依赖关系?仅仅持有一个指向对象的引用或指针并不能神奇地防止后者被破坏。C++不是java.当A和B都有引用时,它怎么可能被销毁?这是因为它是C++,它不能被破坏…我是不是误解了什么?你能详细说明一下吗?是什么让你相信在一个物体上保留一个参照物可以防止这个物体被破坏?你在哪里有这样的想法?对象的生存期在任何方面都不取决于其他对象是否引用它。如果它们被AddRefed怎么办?我的意思是它们只指向某个对象。更正确的说法是,引用类似于普通的C指针。我希望这个链接能帮助你,在任何情况下,循环依赖都会成为一个问题吗?这难道不是弱指针的全部内容吗?若指针拥有它所引用的对象,循环依赖可能是一个问题。例如
shared\u ptr
之类的指针。如果两个对象使用拥有该对象的指针相互引用,则循环依赖关系可能是一个问题。那么它们就不能被删除了。拥有对象的指针示例是
std::shared_ptr