如果一个函数返回一个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可能只返回相同的指针值两次,这是完全安全的。这个例子看起来很愚蠢,但希望它能让我明白我的意思。
THE END
二维码