-
20-09-2019 - |
题
我使用的是提升/情况的指针在我的应用程序。当最后的参考的一个目的是释放后,情况将删除的对象我。的对象的应用程序赞同活动的中心位置的应用程序,类似于观察员/用户的模式。
在目析构,目将取消自己的名单的订阅。该清单的订正本质上只是一个 list<weak_ptr<MyObject> >
.什么我想要做的就是类似这样的:
Type::~Type()
{
Subscriptions::Instance()->Remove(shared_from_this());
}
我的问题是,shared_from_this不能被称为析构所以上述代码扔一个例外。
在我古老的执行情况,订购单只是一个列表中的指针,然后它的工作。但我想用weak_ptr引用,而不是减少风险的我搞砸了记忆手册,内存管理。
因为我依赖的情况做删除的对象,没有单一的地方,在我的代码在哪里我可以从逻辑上的地方呼吁取消。
任何想法什么要做在这种情况?
解决方案
- 你可以摧毁对象通过订阅的实例,那么它就会自动清除的指针。
- 你可以忘记去除他们从订阅--的weak_ptr是不能被锁无论如何,然后你可以删除。
- 你可以分配一个独特的ID对每个对象然后取下通过的唯一标识不在的情况
- 你可以通过一个正常的指针,以消除而不是一个共同的--它将作为一个"ID"。
其他提示
在这里,我的问题是,
shared_from_this
不能被称为 析构函数,因此上面的代码将抛出异常。
这会抛出异常的,因为它已过期的,顾名思义,在析构函数。
那你想要呢?系统 “已过期” 共享指针?只是创建一个空的共享指针。
或过期的弱指针吗
也许如果您发现“问题”是不是shared_from_this
抛出(这是一个症状),但所有业主的固有地已在该点重置或销毁的和弱指针被过期,相当于一个空默认创建弱指针(*),所以你只是应该通过一个缺省初始化弱指针。
此外Subscriptions::Instance()->Remove(weak_OR_owning_pointer)
是没有意义的两种方式(带有弱或拥有指针),你不能比较弱指向任何东西,你只能尽量锁定(然后做一个比较)。
所以,你可以删除过期弱指针。的 Remove
的论据是无用的。强>
(*),要么,或者你有对象的双重所有权的一个非常严重的错误双被销毁!