1、unique_ptr 一个unique_ptr拥有它指向的对象的独占所有权,并且会在指针超出范围时销毁该对象。unique_ptr明确地阻止复制其包含的指针。不过可以使用std::move函数必须用于将包含的指针的所有权转移给另一个unique_ptr。示例代码 2、shared_ptr 引用计数的智能指针。当您想要将一个原始指针分配给多个所有者时使用...
unique_ptr unique_ptr <A> ptr2 = ptr1; 但是,可以使用新的移动语义来移动unique_ptr,即使用std :: move()函数将所包含的指针的所有权转移到另一个unique_ptr。 //有效,资源现在存储在ptr2中 unique_ptr <A> ptr2 = move(ptr1); 因此,当我们想要指向对象的单个指针而销毁该单个指针时将回收该对象时...
还有些STL类是move-only的,比如unique_ptr,这种类只有移动构造函数,因此只能移动(转移内部对象所有权,或者叫浅拷贝),不能拷贝(深拷贝) 复制代码 1 2 3 4 5 c std::unique_ptr<A> ptr_a = std::make_unique<A>();std::unique_ptr<A> ptr_b = std::move(ptr_a); // unique_ptr只有'移动赋值...
这种随情况而已的行为表明,unique_ptr 优于允许两种赋值的auto_ptr 。 当然,您可能确实想执行类似于#1的操作,仅当以非智能的方式使用摒弃的智能指针时(如解除引用时),这种赋值才不安全。要安全的重用这种指针,可给它赋新值。C++有一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。下面是一个...
std::shared_ptr<int>p3=std::make_shared<int>(15);std::unique_ptr<int>p4=std::make_unique<int>(10); 智能指针在初始化时,还可以用于指向动态分配的数组。 代码样例,创建长度为10的整型数组: 代码语言:javascript 复制 //方式一auto Array_1=make_unique<int[]>(10);//方式二std::unique_ptr<in...
(源指针被设为null。)拷贝一个std::unique_ptr是不允许的,因为如果你能拷贝一个std::unique_ptr,会得到指向相同内容的两个std::unique_ptr,每个都认为自己拥有(并且应当最后销毁)资源,销毁时就会出现重复销毁。因此,std::unique_ptr是一种只可移动类型(move-only type)。当析构时,一个non-null std::unique...
在某个对象不再需要持有资源时,可以通过std::move将资源转移出去,比如在将对象放入容器或通过某函数接口转移所有权的情况下: void process_resource(std::unique_ptr<Resource> res_ptr); std::unique_ptr<Resource> owner(new Resource()); process_resource(std::move(owner)); // 所有权转移 ...
unique_ptr为何优于auto_ptr? 如何选择智能指针? 正文 1. 智能指针背后的设计思想 我们先来看一个简单的例子: 1voidremodel(std::string&str)2{3std::string* ps =newstd::string(str);4...5if(weird_thing())6throwexception();7str = *ps;8deleteps;9return;10} ...
unique_ptr是限制最严格的一种智能指针,用来替代之前的auto_ptr,独享被管理对象指针所有权。当unique_ptr对象被销毁时,会在其析构函数内删除关联的原始指针。 unique_ptr对象分为以下两类: unique_ptr该类型的对象关联了单个Type类型的指针 std::unique_ptr<Type> p1(new Type);// c++11 ...
使用unique_ptr<> 智能指针类 创建一个空 unique_ptr 对象 std::unique_ptr<> 本质上是一个在标准命名空间std中的模板类,使用它需要包含头文件<memory>,例如定义一个可以绑定int指针的对象的C++语言代码可以如下写: #include<memory>std::unique_ptr<int> ptr; ...