智能指针 unique_ptr 使用

和shared_ptr不同,可以有多个shared_ptr指向同一个内存,只能有1个unique_ptr指向某个内存。因此unique_ptr不支持普通的拷贝和赋值。

一,先来个表格,唠唠unique_ptr

操作 功能描述
unique_ptr<T> u(q) 智能指针u管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*。
unique_ptr<T, D> u(u, d) 用类型为D的对象d来代替delete
u = nullptr 释放u指向的对象,并将u置为空
u.release() u放弃对指针的控制权,返回内置指针,并将u置为空
u.reset() 释放u所指向的对象,并将u置为空。
u.reset(q) 如果还传递了参数q,让u指向q
u.reset(q, d) 如果还传递了参数d,将会调用d,而不是delete来释放q

小例子索引

代码块 功能描述
test1 不可以拷贝和赋值
test2 自定义删除器
test3 reset和release的使用
test4 unique_ptr作为函数的返回值

小例子

include <iostream>
#include <memory>
#include <vector> using namespace std; class Test{
public:
Test(int d = 0) : data(d){cout << "new" << data << endl;}
~Test(){cout << "del" << data << endl;}
private:
int data;
};
void my_deleter(Test* t){
cout << "worked" << endl;
}
unique_ptr<int> cl1(int p){
return unique_ptr<int>(new int(p));
}
unique_ptr<int> cl2(int p){
unique_ptr<int> rt(new int(p));
return rt;
}
void fl1(unique_ptr<int> p){
*p = 100;
} int main(){
//test1 不可以拷贝和赋值
/*
unique_ptr<int> p1(new int(11));
//unique_ptr<int> p2(p1);//NG
unique_ptr<int> p3(new int(10));
//p3 = p1;//NG
*/ //test2 自定义删除器
//不再调用Test的析构函数了
//unique_ptr<Test, decltype(my_deleter)*> u(new Test(1), my_deleter); //test3 reset和release的使用
/*
unique_ptr<Test> p1(new Test(1));
unique_ptr<Test> p2(p1.release());//将p1置为空,p2指向了原来p1指向的对象
unique_ptr<Test> p3(new Test(3));
p2.reset(p3.release());//先释放了p2所指向的内存,让p2指向了原来p3指向的对象,p3被置为空
p2.release();//错误,p2不会释放内存,而且丢失了能够释放内存的指针
auto p = p2.release();//正确,但必须要记得delete(p)
*/ //test4 unique_ptr作为函数的返回值
/*
unique_ptr<int> p1 = cl1(11);
cout << *p1 << endl;
unique_ptr<int> p2 = cl2(22);
cout << *p2 << endl;
//fl1(p2);//NG 编译不过
*/
}

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 智能指针 unique_ptr 使用的更多相关文章

  1. c++11 智能指针 unique_ptr、shared_ptr与weak_ptr

    c++11 智能指针 unique_ptr.shared_ptr与weak_ptr C++11中有unique_ptr.shared_ptr与weak_ptr等智能指针(smart pointer), ...

  2. C++智能指针 unique_ptr

    C++智能指针 unique_ptr unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory ...

  3. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

  4. C++11 智能指针unique_ptr使用 -- 以排序二叉树为例

    用智能指针可以简化内存管理.以树为例,如果用普通指针,通常是在插入新节点时用new,在析构函数中调用delete:但有了unique_ptr类型的智能指针,就不需要在析构函数中delete了,因为当u ...

  5. C++——智能指针unique_ptr的实现

    起初,我最直观的设计想法,直接设计一个类:包含全部要素(对象,指针计数).然后提供出去. class CPoint { public: CPoint(, ) : x(xVal), y(yVal) {} ...

  6. 智能指针unique_ptr

    转自:https://www.cnblogs.com/DswCnblog/p/5628195.html 成员函数 (1) get 获得内部对象的指针, 由于已经重载了()方法, 因此和直接使用对象是一 ...

  7. 智能指针 unique_ptr

    unique_ptr 不共享它的指针.它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法. 1.不能进行复制构造和赋值操作(unique ...

  8. 智能指针unique_ptr记录

    unique_ptr 对对象独有管理,无法复制,共享,值传递,可以使用move语义来转移控制权. std::default_delete<int> d; std::unique_ptr&l ...

  9. 第20课 unique_ptr独占型智能指针

    一. unique_ptr的基本用法 (一)初始化方式 1. 直接初始化:unique<T> myPtr(new T);  //ok.但不能通过隐式转换来构造,如unique<T&g ...

随机推荐

  1. Go内置函数cap

    func cap(v Type) int 返回指定类型的容量,根据不同类型,返回意义不同. 数组: 元素个数 (和len(v)一样). 数组指针: *v的元素个数 (和len(v)一样). Slice ...

  2. python模块导入细节

    python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...

  3. mybatis的延迟加载、一级缓存、二级缓存

    mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...

  4. [转]Database Transactions in Laravel

    本文转自:https://fideloper.com/laravel-database-transactions Laravel's documentation on Database Transac ...

  5. 【转载】访问IIS中网站出现 403.14 - Forbidden报错信息

    将网站发布后部署到IIS后,配置完应用程序池以及相关设置项后,在浏览器中访问设置好的网站,出现403.14 - Forbidden的错误信息,从错误信息的提示来看,应该是IIS服务器此网站目录的内容被 ...

  6. vue-element-admin项目install出现的问题

    1.需要安装nodejs和git 2. 配置淘宝镜像源(经常是因为墙的原因下载缓慢或者出错) npm config set registry https://registry.npm.taobao.o ...

  7. [PHP]算法-拼接最小字典序的实现

    拼接最小字典序: 给定一个字符串类型的数组strs,请找到一种拼接顺序,使得将所有字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的并放回这个大字符串. 思路: 1.字典序,12345这五个数, ...

  8. Mac下写博客工具ecto相关资料

    下载地址: https://www.macupdate.com/app/mac/8918/ecto 相关注册码: http://www.cnblogs.com/yssgyw/p/3284501.htm ...

  9. Children’s Queue(hdu1297+递推)

    Children’s Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. JavaWeb-BeginTomcat

    上手Tomcat 1.Ubuntu 18.04 下载/安装Tomcat 以下内容参考链接 安装JDK sudo apt-get update sudo apt-get install default- ...