std::unique_ptr是一种独占所有权的智能指针。它确保一个对象只能被一个unique_ptr所拥有,这意味着不能复制unique_ptr,只能移动它。 主要特性 独占所有权: 一个unique_ptr不能被复制,只能被移动。 自动释放: 当unique_ptr离开作用域时,它所管理的对象会被自动删除。 零开销: 在大多数操作中,unique_ptr与原始...
#include<memory>voidmanageResource(std::unique_ptr<int>ptr){// 使用资源}// ptr在此处自动销毁,资源被释放intmain(){autoptr=std::make_unique<int>(42);// 创建并初始化unique_ptrmanageResource(std::move(ptr));// 移动所有权到函数内// ptr现在为空,资源已在manageResource内部被释放return0;} s...
unique_ptr的功能基本和shared_ptr相同,也是用于管理堆内存的智能指针,但是不允许多个unique_ptr指向同一个对象。 2.2 unique_ptr使用方法 初始化 std::unique_ptr<Z> up1; std::unique_ptr<Z> up2(nullptr); std::unique_ptr<Z> up1(new Z(1)); std::unique_ptr<Z> up2(up1); // 错误,不能使...
unique_ptr 对象不可复制 由于unique_ptr 不可复制,只能移动。 因此,我们无法通过复制构造函数或赋值运算符创建unique_ptr对象的副本。 // 编译错误 : unique_ptr 不能复制 std::unique_ptr<Task> taskPtr3 = taskPtr2; // Compile error // 编译错误 : unique_ptr 不能复制 taskPtr = taskPtr2; //com...
std::unique_ptr unique_ptr代表着这个指针是一块内存资源的唯一拥有者。unique_ptr维护一个指针,并在其析构函数中释放该指针。 unique_ptr的一大优点能够在语义上表达一定的意义和意图。就比如下面这个代码: std::unique_ptr<House>buildAHouse(); 返回值的类型是一个std::unique_ptr,这其实就是在告诉你该函数...
unique_ptr 头文件 代码语言:javascript 代码运行次数:0 复制Cloud Studio 代码运行 template <typename T, typename D = std::function<void(T*)>> class UniquePointer { public: UniquePointer(const UniquePointer&) = delete; UniquePointer& operator=(const UniquePointer&) = delete; UniquePointer(T *raw...
一看名字就知道是共享型的智能指针,这就意味着你可以创建多个shared_ptr实例,并指向同一个Heap内存中对象。unique_ptr只能用于一些简单的场景,而shared_ptr可用于所有复杂的场景。 每个shared_ptr的实例大小其实也很小,只占用2个指针,一个指向它管理的对象,另一个是指向控制control块的指针。啥是控制块呢,其实是第...
当unique_ptr离开其作用域或被显式重置时,它会自动删除其所指向的对象。 不支持复制构造函数和赋值操作符,但可以通过转移语义(move semantics)进行移动构造和移动赋值,转移过程中原unique_ptr变为空指针,所有权转移到新unique_ptr。 可以直接或间接管理非数组类型以及数组类型。
unique_ptr只保存了类型指针 ptr 和这个指针的析构方法,调用 delete ptr,就需要ptr的完整类型,为了防止这个问题出现,直接通过 assert sizeof 排除掉了这种风险。unique_ptr相当于在编译时绑定了删除器。 shared_ptr保存的是一个控制块的指针。控制块包含的就是一个引用计数和一个原来对象的裸指针。控制块中初始化...
这下我们明白了,unique_ptr的封装太简单了,没有 control block,Deleter(包括默认的std::default_delete)直接做在unique_ptr一起了,这就导致unique_ptr的析构函数需要亲手析构被管理的类型,因此析构函数必须看到 complete type。然而反过来,因为构建的时候只需要保存下指针,所以unique_ptr构造的时候不需要看到 complete...