智能指针 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. ES6躬行记(3)——解构

    解构(destructuring)是一种赋值语法,可从数组中提取元素或从对象中提取属性,将其值赋给对应的变量或另一个对象的属性.解构地目的是简化提取数据的过程,增强代码的可读性.有两种解构语法,分别是 ...

  2. linux:终端常用命令 + vi命令修改文件及保存 方法

    首先介绍一下Ubuntu下各个目录的一般作用: /  这就是根目录,一台电脑有且只有一个根目录,所有的文件都是从这里开始的.举个例子:当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录 ...

  3. 读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥

    介绍 DK1.5之后,提供了读写锁ReentrantReadWriteLock,读写锁维护了一对锁:一个读锁,一个写锁.通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升.在读多写少的情况下, ...

  4. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  5. 利用redis实现分布式锁

    分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于ZooKeeper的分布式锁: 3. 基于Redis的分布式锁: 这里大概说一下三种方式的优缺点,数据库乐观锁优点是实现简单,只需要for ...

  6. Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑

    应用场景 上一篇<Spring Cloud Stream消费失败后的处理策略(一):自动重试>介绍了默认就会生效的消息重试功能.对于一些因环境原因.网络抖动等不稳定因素引发的问题可以起到比 ...

  7. synchronized和ReentrantLock的区别

    synchronized和ReentrantLock的区别 synchronized是和if.else.for.while一样的关键字,ReentrantLock是类,这是二者的本质区别. 代写 既然 ...

  8. IntelliJ IDEA为类和方法自动添加注释

    1.为类添加自动注释模版 File-->Settings-->Editor-->File and Code Templates /** * @author :mmzs * @date ...

  9. 【转载】C#检测客户端输入的内容是否含有危险字符串

    用户在客户端提交的内容有时候并不可信,如果客户端提交的内容中含有危险字符串信息,则很有可能造成应用程序安全性问题,如SQL注入风险等.因此在接收客户端提交过来的数据后,我们首先需要判断数据中是否含有危 ...

  10. spring boot 打jar包,获取resource路径下的文件

    前言:最近在spring boot项目静态类中获取resource路径下文件,在idea中启动都可以获取,但是打包后变成了jar包 就无法获取到. 我想到了两种方法,一种是根据http访问静态资源比如 ...