创建一个无所有权的shared_ptr



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

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

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

shared_ptr被设为拥有者。如果你想在你的prgram的某个部分使用一个非拥有指针,请使用weak_ptr,如下所示:

std::shared_ptr<Object> sp(new Object);
std::weak_ptr<Object>(sp);

您正在尝试一种"后座驱动程序"风格的内存管理;您希望使用shared-ptr,但也希望控制shared_ptr何时释放资源!

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

  1. 只需使用shared_ptr,就不用在sprite管理器类中进行任何内存管理或资源所有权。相信shared_ptr能够完成它的工作。如果您需要知道资源何时被销毁,您可以始终使用observer模式或类似模式,并在资源被销毁时向管理器发送资源类消息。当然,这意味着你不能要求你的精灵管理器提供对现有精灵的额外引用,这不是很好。

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

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

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

最新更新