![]() |
1
5
您的程序具有未定义的行为。
您可以通过定义
或
当您使用动态分配的内存时,额外的作用域没有用处。你最好不要用它。
如果选择使用第二种方法,请确保释放内存。您需要添加
函数结束之前。 更新,回应OP的评论你说:
由于取消引用无效指针是导致未定义行为的原因,因此必须跟踪观察者的生存期,并确保在必要时更新观察者列表。没有这些,你就是在追求未定义的行为。 |
![]() |
2
3
注意,我不推荐以下方法,但我认为它符合您的要求。您有一个重复的观察者列表。一个由观察者控制,另一个使用弱指针,由可观察对象处理。
我相信你也可以用
计划是将维护从ObservableSubject移回Observators。 |
![]() |
3
2
是的,是的。它调用未定义的行为,因为
整个想法对你毫无益处。即使您使ref-to-pointer方法正确工作,您也取决于一件事:那就是
那正是
指针变量设置为
对于堆对象:如何确保没有人通过其他指针删除对象?或者忘记将注册的指针设为null?对于像您的示例中那样的堆栈对象,情况甚至更糟。对象超出范围并自动消亡。除非引入一个必须手动管理的额外指针变量,否则没有机会将任何内容设为null。 您可以考虑两种方法的一般替代方案:
现实生活中的实现通常朝着利用C++析构函数取消注册的方向发展。例如,看看Qts信号/插槽机制。 |
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 3 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 3 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 3 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 7 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 7 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 7 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 7 年前 |