共享指针可能指向一个对象,但管理另一个对象的生命周期。奇怪的是,它可能什么也没做,但仍然指向某些东西。有一个特殊的构造函数,它接受另一个共享指针,用于确定要共享哪个对象。我们可以在其中传递空的共享指针。
template <typename T>
std::shared_ptr<T> fake_shared(T *ptr)
{
std::shared_ptr<T> dummy (nullptr); // we have nothing to manage;
std::shared_ptr<T> faked (dummy, ptr); // but we have something to point to;
return faked;
}
此外,我们可以利用两个事实。首先,此构造函数将接受任何(其他)类型的共享指针。其次,std::shared_ptr<void>
是合法的,可以用来更清楚地表达我们的意图。
template <typename T>
std::shared_ptr<T> fake_shared(T *ptr)
{
std::shared_ptr<void> dummy (nullptr); // we have really nothing to manage;
std::shared_ptr<T> faked (dummy, ptr); // but we have something to point to;
return faked;
}
或者,可以使用接受自定义删除器的构造函数,并将无操作删除器传递给它。
template <typename T>
std::shared_ptr<T> fake_shared(T *ptr)
{
std::shared_ptr<T> faked (ptr, [](T *){}); // won't be deleted;
return faked;
}
编辑:修订、共享无效、自定义删除器。