std::unique_ptr允许自定义删除器,用于在对象销毁时执行特定的清理操作: structCustomDeleter{voidoperator()(int*ptr)const{std::cout<<"Deleting int pointer"<<std::endl;deleteptr;}};std::unique_ptr<int,CustomDeleter>ptr(newint(10),CustomDeleter()); 与原始指针的区别 与原始指针相比,std::unique_p...
std::make_unique 是 C++11 标准库中的一个实用函数,它是 C++14 标准中引入的,用于创建一个 std::unique_ptr 智能指针,并将其指向一个新分配的对象。使用 std::make_unique 比直接使用 new 表达式更为安全,因为它可以防止资源泄漏,并提供异常安全保证。 std::unique_ptr 是一个模板类,它提供了对动态分配对...
// 避免直接使用new - 反例:直接使用new而不通过std::make_uniquestd::unique_ptr<int>ptr(newint(42));// 不推荐// 解释:尽管这样可以工作,但推荐使用std::make_unique,它提供更好的异常安全性和代码清晰度。 // 资源管理 - 反例:多个unique_ptr指向同一资源int*rawPtr=newint(42);std::unique_ptr<i...
std::unique_ptr是一种独占的语义,即只允许一个智能指针引用裸指针,这区别于std::shared_ptr允许多个shared_ptr引用同一个裸指针,它没有引用计数,它的性能比shared_ptr会高一点。 在用法上std::unique_ptr和std::shared_ptr是类似的,主要的不同是std::unique_ptr之间的赋值需要通过std::move实现。 在code2 ...
自动释放: 当unique_ptr离开作用域时,它所管理的对象会被自动删除。 零开销: 在大多数操作中,unique_ptr与原始指针的性能相当。 自定义删除器: 可以指定自定义的删除方式。 示例代码 #include<iostream> #include<memory> classMyClass{ public: MyClass() { std::cout <<"MyClass constructed\n"; } ...
// 1.创建一个指向整型对象的unique_ptr,默认使用delete运算符释放资源 std::unique_ptr<int> uptr(new int(10)); // 2.C++ 14 使用 std::make_unique std::unique_ptr<int> uptr = std::make_unique<int>(10); std::unique_ptr<MyClass> uptr = std::make_unique<MyClass>(); ...
和std::auto_ptr一样,std::unique_ptr也是一种智能指针,它也是通过指针的方式来管理对象资源,并且在 unique_ptr 的生命期结束后释放该资源。 unique_ptr 持有对对象的独有权 —— 两个 unique_ptr 不能指向一个对象,...
std::unique_ptr的一个常见用法是在对象继承谱系中作为工厂函数的返回型别。这种继承谱系的工厂函数通常会在堆上分配一个对象并且返回一个指涉到它的指针,并当不在需要该对象时,由调用者负责删除之。 三、示例(以下代码需要c++14支持) #ifndefUNIQUEPTRDEMO_H#defineUNIQUEPTRDEMO_H#include<iostream>#include<memo...
unique_ptr<T>的构造函数接受指向T类型的对象的原始指针(因此,它接受T*)。
原先使用普通指针时,分配内存后需手动释放,以防内存泄漏。但使用std::unique_ptr时,超出范围自动调用delete,无需手动释放。这是其优势,减少内存泄漏风险。在C++11中,直接使用构造函数创建std::unique_ptr是常见做法,但随着std::make_unique的引入,这种方法不再推荐,因为它可能导致异常不安全。std:...