c++ - 定义不删除指针的最干净的方法是什么?

标签 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));
      }
 };

是否有一种更简洁的方法可以在不定义不删除结构的情况下执行此操作?

最佳答案

[..] an old C-function returning a pointer to an static array. I wrote a wrapper around that function and returned a std::unique_ptr

不要。返回 std::unique_ptr 对调用者说:

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

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

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

关于c++ - 定义不删除指针的最干净的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752058/

相关文章:

c++ - 多态类的构建

c++ - vector <pair<int,int>>v(size);打印时显示 0 作为值

c++ - 为 RAII 包装 C 分配

c++ - 同一容器中的共享指针和原始指针

c++ - 如何判断哪个类拥有指针

c++ - 何时使用预处理器指令在 C++ 中定义函数?

c++ - 模板化运算符<<显式实例化和 header

c++ - Ncurses - 在初始化窗口之前等待按下按钮的空白窗口

c++ - 检查枚举类是否包含特定标识符

c++ - 三元运算符和 if constexpr