【发布时间】:2020-12-02 20:15:45
【问题描述】:
我正在了解std::unique_ptr,试图了解它所代表的含义。
给定一个返回unique_ptr 的函数(我无法控制),是否暗示/很好理解每次调用都会返回一个指向新对象的unique_ptr(与之前的任何调用不同)?
例如,下面的代码在退出时会产生一个双释放,我希望我能正确理解原因:unique_ptrs 在销毁时删除它们的底层对象;因此,封装相同内存/对象的两个unique_ptrs 会导致第二个被破坏时双重释放。因此,函数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;
}
【问题讨论】:
-
是的,每个
unique_ptr应该指向一个唯一的对象。如果不是,那么他们要么使用自定义删除器,您可以从它的签名中看出,因为删除器是模板参数的一部分,要么处理它,要么代码有错误。 -
您发布的代码有一个错误 -
p将是freed 两次。 -
一个返回 unique_ptr 的函数仅表明这是对象的唯一拥有句柄。虽然工厂确实是一个非常常见的用例,但通常它不一定是刚刚创建的新对象。构建一个将 unique_ptr 传递回最初创建它的组件的 API 并非不可能,然后组件在特定情况下将所有权授予其他调用者。考虑智能指针所暗示的所有权而不是创建对象的时间会更有益。
标签: c++ unique-ptr double-free