我使用的是提升/情况的指针在我的应用程序。当最后的参考的一个目的是释放后,情况将删除的对象我。的对象的应用程序赞同活动的中心位置的应用程序,类似于观察员/用户的模式。

在目析构,目将取消自己的名单的订阅。该清单的订正本质上只是一个 list<weak_ptr<MyObject> >.什么我想要做的就是类似这样的:

Type::~Type()
{
  Subscriptions::Instance()->Remove(shared_from_this());
}

我的问题是,shared_from_this不能被称为析构所以上述代码扔一个例外。

在我古老的执行情况,订购单只是一个列表中的指针,然后它的工作。但我想用weak_ptr引用,而不是减少风险的我搞砸了记忆手册,内存管理。

因为我依赖的情况做删除的对象,没有单一的地方,在我的代码在哪里我可以从逻辑上的地方呼吁取消。

任何想法什么要做在这种情况?

有帮助吗?

解决方案

  1. 你可以摧毁对象通过订阅的实例,那么它就会自动清除的指针。
  2. 你可以忘记去除他们从订阅--的weak_ptr是不能被锁无论如何,然后你可以删除。
  3. 你可以分配一个独特的ID对每个对象然后取下通过的唯一标识不在的情况
  4. 你可以通过一个正常的指针,以消除而不是一个共同的--它将作为一个"ID"。

其他提示

  

在这里,我的问题是,shared_from_this不能被称为   析构函数,因此上面的代码将抛出异常。

这会抛出异常的,因为它已过期的,顾名思义,在析构函数。

那你想要呢?系统 “已过期” 共享指针?只是创建一个空的共享指针。

过期的弱指针吗

也许如果您发现“问题”是不是shared_from_this抛出(这是一个症状),但所有业主的固有地已在该点重置或销毁的和弱指针被过期,相当于一个空默认创建弱指针(*),所以你只是应该通过一个缺省初始化弱指针。

此外Subscriptions::Instance()->Remove(weak_OR_owning_pointer)是没有意义的两种方式(带有弱或拥有指针),你不能比较弱指向任何东西,你只能尽量锁定(然后做一个比较)。

所以,你可以删除过期弱指针。的 Remove的论据是无用的。

(*),要么,或者你有对象的双重所有权的一个非常严重的错误双被销毁!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top