定义无删除指针的最干净方法是什么?

Cat*_*iel 3 c++ smart-pointers c++17

我最近遇到了一个旧的C函数,该函数返回一个指向静态数组的指针。我围绕该函数编写了一个包装器,并返回了一个std::unique_ptr使用不删除来强调要返回的指针类型的-对用户的“请勿删除我”警告。这是示例代码

 extern "C" int *f(int i);

 struct noop
 {
      template <typename T>
      void operator() (T t) const noexcept
      {
      }
 };
 class MyClass
 {
     public:          
     std::unique_ptr<int, noop> F(int value) const 
      { 
            return std::unique_ptr<int, noop>(f(value));
      }
 };
Run Code Online (Sandbox Code Playgroud)

有没有定义不删除结构的更干净的方法?

Dan*_*our 7

[..]旧的C函数返回指向静态数组的指针。我围绕该函数编写了一个包装器,并返回了一个 std::unique_ptr

不要。返回std::unique_ptr给呼叫者说:

  • 你拥有这个记忆,自己清理
  • 您拥有此内存,没有其他人会干涉(线程安全)
  • 您拥有此记忆。这样,每次调用时都会得到一个新对象(包装函数)。

对于静态数组的指针,这都不是真的!

坚持使用原始指针或使用一些包装器类以允许类似引用的访问。std::reference_wrapper例如在复制时还提供诸如原始指针之类的语义。

  • @FrançoisAndrieux确实,但是从函数IMO返回唯一指针应该具有该约束。或至少在指向类型中具有线程安全的实现。如果一个线程拥有一个对象而其他线程正在使用该对象,那么我将使用“ shared_ptr” /“ weak_ptr”组合。 (2认同)
  • 没错,在函数的返回类型的上下文中,您必须假定不存在对指向对象的其他引用。否则,终生不完全掌握在您手中,因此所有权不是唯一的。 (2认同)