让我们考虑这个类,它根据构造方式拥有或查看指针。
template<class T>
class OptionalUniquePtr
{
public:
OptionalUniquePtr(p*)
: m_p(p)
{}
OptionalUniquePtr(std::unique_ptr<T>&& p)
: m_owned_p(std::move(p))
, m_p(p)
{}
T* get()
{
return m_p;
}
private:
std::unique_ptr<T> m_owned_p;
T *m_p;
};
除了调整或优化外,我的问题是:这是个坏主意吗?我正在研究一些可以选择拥有或查看一些指针的代码:
std::unique_ptr<Bar> b1 = ...;
Bar *b2 = ...;
// one million lines later
Foo f1(std::move(b1),...); // ownership transfered to f1
Foo f2(b2,...); // just viewing b2, caller manages lifetime. Risky, but usually owners have long lifetime
想象一下,Foo是一个大班,除了其他事情外,他还在酒吧做些什么。我希望Foo能够灵活地接受两者,因此它可以在内部包含OptionalUniquePtr。另一个选择是像这样的模板Foo
Foo<std::unique_ptr<Bar>> f1(std::move(b1),...);
Foo<Bar*> f1(b2,...);
第二种方法的优点是对内存所有权更为明确。
另一种选择是使用std :: shared_ptr开头,但是在庞大的代码库中,这是不可行的。
社区对OptionalUniquePtr有何看法?
谢谢
Simone