如果一个函数返回一个std::unique_ptr,假设每个返回值都指向一个新对象是否合理?

我正在学习std::unique_ptr,试图理解它代表什么。

给定一个返回 a 的函数(不受我控制)unique_ptr,是否暗示/很好理解每次调用返回一个unique_ptr指向新对象的 a (与任何先前的调用不同)?

举例来说,以下代码在退出时产生双重释放,我希望我正确理解为什么:unique_ptrs 在销毁时删除其底层对象;因此,unique_ptr封装相同的内存/对象的两个s 会在破坏第二个时导致双重释放。因此,以下函数的实现是否会getUniquePtr()被普遍/隐含地理解为不合理?

// main.cpp
#include <memory>
#include <iostream>

std::unique_ptr<int> getUniquePtr() {
  static int* p = new int(42);
  return std::unique_ptr<int>(p);
}

class PtrOwner {
public:
  std::unique_ptr<int> p_;
};

int main( int argc, char* argv[] ) {
  PtrOwner po1;
  PtrOwner po2;
  po1.p_ = getUniquePtr();
  po2.p_ = getUniquePtr();

  return 0;
}

回答

应该假设,如果函数返回std::unique_ptr<T>,则返回的智能指针指向当前未被其他任何人管理的对象。这并不一定意味着它总是指不同的对象。只要遵循这个约定,就可以避免双重释放错误。如果违反此约定,将出现双重释放错误。

例如,如果您看到这样的函数:

std::unique_ptr<T> foo(std::unique_ptr<T> arg);

std::move(arg)在某些情况下,此函数可能会返回,或者它可能会破坏arg并返回某个其他指针。(您必须阅读文档才能知道它的作用)。这意味着您可以执行以下操作:

auto t = std::make_unique<T>();
t = foo(std::move(t));
t = foo(std::move(t));

在这种情况下,foo可能只返回相同的指针值两次,这是完全安全的。这个例子看起来很愚蠢,但希望它能让我明白我的意思。


以上是如果一个函数返回一个std::unique_ptr,假设每个返回值都指向一个新对象是否合理?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>