6

我对 C++11 还是很陌生,现在正在努力通过避免直接使用指针来提高我的 C++ 技能。我正在尝试编写一个精灵管理器来跟踪以前加载的精灵并释放未使用的精灵。我正在尝试为此使用 shared_ptr (指向位图的指针),但管理器还必须保留一个 shared_ptr 来创建精灵 - 所以引用计数不会下降到 0。我可以以某种方式声明“父”shared_ptr在我的经理非拥有所以它不算作参考(并且仍然创建该shared_ptr的拥有副本)?

4

3 回答 3

11

使用weak_ptr。这将解决你的问题。您不需要释放它们,因为它们会自动释放。在weak_ptr 上使用锁来获取实际的shared_ptr。

use_count 还将为您提供当前的引用数。

于 2012-07-30T12:56:08.420 回答
3

shared_ptr被制造为拥有。如果你想在你的 prgram 的某些部分使用非拥有指针,weak_ptr如下所示:

std::shared_ptr<Object> sp(new Object);
std::weak_ptr<Object>(sp);
于 2012-07-30T13:00:47.713 回答
1

你正在尝试做一种“后座司机”风格的内存管理;你想使用shared-ptr,但你也想控制何时shared_ptr释放资源!

您可以在这里做一些显而易见的事情。

  1. 只需使用shared_ptr精灵管理器类中的任何类型的内存管理或资源所有权即可。信任shared_ptr做它的工作。如果您需要知道资源何时被销毁,您始终可以使用观察者模式等,并让您的资源类在销毁时向管理器发送消息。当然,这意味着您不能要求您的精灵管理器提供对现有精灵的额外引用,这不是很好。

  2. 编写自己的智能指针。这不一定是微不足道的,但编写一个特定于资源的引用计数智能指针并不是火箭科学(它比编写类似的东西要简单得多shared_ptr,例如)。然后,当只剩下一个对资源的引用(例如,它自己的引用)时,管理器可以终止资源。

  3. 其他人都已经提到了weak_ptr。具有 (1) 的所有优点,只有您可以创建shared_ptr引用相同底层资源的其他实例。

您可能还需要考虑资源使用模式以及加载资源的成本。您可能不一定要在应用程序停止引用资源后立即销毁它;如果一秒钟后再次请求它,可能需要一些时间来重新加载它。在资源闲置一段时间后懒惰地释放资源可能是一种更好的方法。只是一个想法。

于 2012-07-30T13:09:50.323 回答