首页 > 其他分享 >unique_ptr使用详解(介绍,场景,方法,实例)

unique_ptr使用详解(介绍,场景,方法,实例)

时间:2022-10-27 15:22:57浏览次数:65  
标签:... 销毁 详解 内存 unique ptr delete

1.什么是uniqueptr

uniqueptr是智能指针的一种,主要用于C++的内存申请和释放,因为C++在申请内存后,要手动进行delete,这样就会出现有时候忘记delete,或者return,break,异常等原因没有执行到delete,如下面的代码所示,new了一个A的对象,要时刻注意delete销毁对象,而且如果是new了多个对象,需要同时注意什么时候销毁什么对象,return,break,异常等情况都要考虑,所以这就给开发造成很大的困扰。不知道什么时候delete内存,所以引入uniqueptr指针,当指针销毁不时,自动删除指针指向的内存。unique_ptr的特点是只允许一个指针指向这块内存,unique_ptr赋值操作是不允许的,例如uniqueptr1=uniqueptr2;是不允许的,只能通过转移,uniqueptr1=move(uniqueptr2);将uniqueptr2指向的内存转移给uniqueptr1。

#include <memory>
#include<iostream>
using namespace std;

class A {};
int main()
{
    A* ptrA = new A;
    try
    {
    if()
    {  
      delete ptrA;
      return -1;
    }
     //... //... //... //... //... } catch (...) { delete ptrA; //1 throw; } delete ptrA; //2 return 0; }

 

2.使用方法

上面的代码如果用uniqueptr就方便很多,只要申请unique_ptr指针指向内存,ptrA的作用域结束后销毁,会自动销毁ptrA 指向的内存;不用再去关注什么时候销毁内存;

#include <memory>
#include<iostream>
using namespace std;

class A {};
int main()
{
    unique_ptr<A> ptrA = make_unique<A>();
  //unique_ptr<A> ptrA(new A);//第二种方式 try {     if()     {         //.....       return -1;     }      //... //... //... //... //... } catch (...) { throw; } return 0; }

3.详细介绍

#include "stdafx.h"

#include <iostream>
using namespace std;
#include <string>
#include <memory>

int main()
{
    
        unique_ptr<int> uptr1 = make_unique<int>();//新建第一个对象
        //unique_ptr<int> uptr2 = uptr1;//错误,唯一指向,不能赋值给其他指针
        unique_ptr<int> uptr2 = move(uptr1);//将指针uptr1指向的内存转移给uptr2,uptr1变为空
        unique_ptr<int> uptr3= make_unique<int>();//新建第二个对象
        int* p4 = uptr3.get();//返回指针uptr3指向的对象,可以修改对象的值,但是不能执行delete p4;否则uptr3销毁时释放内存会报错;
        *p4 = 8;//修改内存保存的值
        //delete p4;//会报错如下图所示,这里销毁一次,uptr3又销毁一次;
        uptr3.release();//释放uptr3指向内存,但是不销毁内存;
        unique_ptr<int> uptr4(new int);//新建第三个对象
        uptr4.reset();//清空uptr4指向,并且销毁指向内存;
        unique_ptr<int> uptr5(new int);//新建第四个对象;
        uptr5.reset(new int);//新建第五个对象,uptr5指向第五个对象,并销毁第四个对象内存;
        unique_ptr<int> uptr6;
        uptr6.reset(new int);//新建第六个对象,uptr6指向第六个对象
return 0; }

 

 

 

标签:...,销毁,详解,内存,unique,ptr,delete
From: https://www.cnblogs.com/bclshuai/p/16832347.html

相关文章

  • 【AGC】鸿蒙证书管理问题详解
    ​AGC-证书管理页面的相关问题详解 【问题背景】鸿蒙应用在AGC平台-用户与访问-证书管理页面添加证书的问题:​ 【问题描述】1、官网文档发布证书最多只能申请一个......
  • Optional类详解
    转自:  ​​http://www.java265.com/JavaCourse/202206/3817.html​​下文笔者讲述jdk8中Optional关键字的功能简介说明,如下所示:Optional关键字的功能Optional类的功能:......
  • nginx配置文件location详解
    Centos7安装nginx完成后发现nginx.conf文件中没有server,只有events{...}和http{...},这是什么问题?在nginx.conf文件同目录的conf.d文件夹下的default.conf文件里面,应该是新......
  • pip包管理器安装第三方模块所遇问题详解
    原因分析:默认的python环境为2.7,而pip在安装的时候会提示Python2.7reachedtheendofitslifeonJanuary1st,2020.,因此我们需要更改运行环境。换言之,此时我们用pi......
  • Jenkins pipeline:pipeline 语法详解
    jenkins pipeline总体介绍 pipeline是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可......
  • Windows10 和 WinServer2012 Telnet配置和用法详解
     Windows10 和 WinServer2012 Telnet配置和用法详解 Telnet协议是TCP/IP协议族的其中之一,是Internet远程登录服务的标准协议和主要方式,常用于网页服务器的远程控制,可......
  • java教程之java继承示例详解
    什么是继承(extends)?继承是:新定义的类是从已有的类中获取属性和方法的现象。这个已有的类叫做父类,从这个父类获取属性和方法的类叫做子类。ExtendsDemo1.java......
  • mysql主从复制原理详解32讲
    请问Mysql的主从复制原理是什么?如果我要实现主从复制,需要怎么操作呢?(如果有具体教程就最好了)可以参考这篇文章下面关于数据库主从复制机制的原理概述,哪个是错误的?主库的主......
  • MySQL之——MySQL5.7以上my.cnf 配置文件详解
    简单配置,低配置服务器配置[client]#客户端设置port=3306socket=/data/mysql/data/mysql.sockdefault-character-set=utf8mb4[mysqld]user=mysql......
  • 微服务组件---- Spring Cloud Alibaba 链路追踪 skywalking 详解
    skywalking是什么【1】skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是观察性分析平台和应......