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

时间:2019-04-18 18:42:37

标签: c++ c++17 smart-pointers

我最近遇到了一个旧的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));
      }
 };

有没有一种更干净的方法来执行此操作而不定义无删除结构?

2 个答案:

答案 0 :(得分:7)

  

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

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

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

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

用原始指针粘住,或使用一些包装器类来允许类似引用的访问。 std::reference_wrapper还提供例如复制时的原始指针之类的语义。

答案 1 :(得分:0)

C ++编码准则建议使用别名或“虚拟”包装程序来表示所有权或非空性:

有关其实现,请查看:

https://github.com/Microsoft/GSL/blob/master/include/gsl/pointers

您将看到owner<>non_null<>的示例。

您可以类似定义。显然,不能删除非所有指针。如果您只想提醒,那么

template <class T, class = std::enable_if_t<std::is_pointer<T>::value>>
using non_owner = T;

,如果要执行,请从链接中复制和修改non_null<>的代码。

相关问题