我对C++11还比较陌生,现在正在努力提高我的C++技能,尝试避免直接使用指针。我正试图编写一个精灵管理器,它可以跟踪以前加载的精灵并释放未使用的精灵。我试图使用shared_ptr (指向位图的指针) 来实现这一点,但管理器还必须保持一个shared_ptr来创建精灵,以便引用计数不会降为0。我是否可以在我的管理器中声明“父”shared_ptr为非所有权,因此它不计为引用(并仍然创建该shared_ptr的所有权副本)?
我对C++11还比较陌生,现在正在努力提高我的C++技能,尝试避免直接使用指针。我正试图编写一个精灵管理器,它可以跟踪以前加载的精灵并释放未使用的精灵。我试图使用shared_ptr (指向位图的指针) 来实现这一点,但管理器还必须保持一个shared_ptr来创建精灵,以便引用计数不会降为0。我是否可以在我的管理器中声明“父”shared_ptr为非所有权,因此它不计为引用(并仍然创建该shared_ptr的所有权副本)?
使用weak_ptr来解决问题。这样你就不需要手动释放它们了,因为它们会自动释放。在weak_ptr上使用锁定操作获取一个实际的shared_ptr。
use_count也可以给出当前引用的数量。
shared_ptr
是用来拥有对象的。如果您希望程序的某个部分使用非拥有指针,请使用weak_ptr
:
std::shared_ptr<Object> sp(new Object);
std::weak_ptr<Object>(sp);
您正在尝试进行一种“后座驾驶员”式的内存管理;您想使用shared-ptr
,但同时也想控制shared_ptr
何时释放资源!
这里有几个明显的解决方案。
在您的精灵管理器类中,只需使用 shared_ptr
,不必担心任何内存管理或资源所有权。相信 shared_ptr
能够完成其工作。如果您需要知道资源何时被销毁,您可以始终使用观察者模式或类似方法,并在资源类销毁时向管理器发送消息。当然,这意味着您不能要求您的精灵管理器提供对现有精灵的其他引用,这并不是很好。
编写自己的智能指针。这并不一定是微不足道的,但编写特定于资源的引用计数智能指针并不是什么难事(例如,它比编写像 shared_ptr
这样的东西简单得多)。然后,当只剩下一个引用时(例如,它自己的引用),管理器可以终止资源。
其他人已经提到了 weak_ptr
。它具有 (1) 的所有优点,只是您可以创建额外的 shared_ptr
实例来引用相同的底层资源。