可选的指针所有权

问题描述 投票:0回答:1

让我们考虑这个类,它根据构造方式拥有或查看指针。

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

c++ c++11 pointers memory-management unique-ptr
1个回答
0
投票
答案是这种“可选所有权”已经由std :: shared_ptr实现。代码看起来像这样:
© www.soinside.com 2019 - 2024. All rights reserved.