gpt4 book ai didi

c++ - 在 lambda [C++] 中捕获它的替代方法

转载 作者:行者123 更新时间:2023-11-30 01:09:03 24 4
gpt4 key购买 nike

我知道是否必须在 lambda 中调用成员函数以进行回调,我在 lambda 中捕获它并且它运行良好。但我最近看到一些崩溃,似乎在 this 指向的对象已经被销毁后访问成员函数。简而言之,在关闭时对象被销毁,但指针在 lambda 中传递,它被访问并导致崩溃。

所以,我试图了解社区在这种情况下通常会做什么。我找不到太多相关信息,但我认为 shared_ptr 可能是一个选项。

如果能帮助我理解和实现替代方案,我们将不胜感激。

最佳答案

在 C++ 中,您负责跟踪对象的生命周期。

这意味着您必须跟踪保存指针和对其他事物的引用的事物的生命周期,并确保它们的生命周期不会与这些事物一样长。

你的任务失败了。您传递的 lambda 捕获指向周围对象的指针,就好像它们在糖果中一样,而不是直接进入对象的内部。

通过散布共享指针来解决生命周期问题通常不是一个好主意。使对象的生命周期更加模糊可能会减少立即崩溃的事件,但是对象生命周期的模糊球不会使您的程序运行。模糊的球要么扩展到包含您的整个程序,现在它永远不会真正关闭,要么它自己回圈并 self 延续,泄漏资源。

共享指针可用于狭窄的情况,在这种情况下,您具有定义的生命周期关系,最好将其建模为共享所有权。这与“我的对象先于它们的指针消失,所以我应该尝试共享指针!”完全不同。你有一个对象生命周期问题。你试试共享指针。现在您有两个问题:原始对象生命周期问题和您的共享指针问题。

回调是您需要严格的生命周期规则的例子。多久回调一次?你什么时候停下来?您回收资源的紧急程度如何?你如何注销回调?等等

我编写了使用共享指针和弱指针的回调系统。他们并不完美。这是我在谷歌上找到的:broadcaster .收听者存储 token 以表示“继续与我交谈”,当他们离开时广播者停止对它提示。

关于c++ - 在 lambda [C++] 中捕获它的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40919587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com