首页 > 其他分享 >auto_ptr和unique_ptr用法学习

auto_ptr和unique_ptr用法学习

时间:2024-05-20 23:51:17浏览次数:15  
标签:auto move 左值 unique ptr 赋值

转自:https://blog.csdn.net/cpp_learner/article/details/118912592,chatgpt

1.auto_ptr存在的问题

  • 复制或者赋值都会改变资源的所有权;auto_ptr 的设计有一些缺陷,特别是其所有权转移语义(transfer of ownership)。当一个 auto_ptr 被赋值或拷贝时,所有权会从源对象转移到目标对象,这使得 auto_ptr 在容器和算法中使用时容易出错。
  • 不支持对象数组的内存管理;

2.unique_ptr介绍

  1. 基于排他所有权模式:两个指针不能指向同一个资源
  2. 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
  3. 保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
  4. 在容器中保存指针是安全的。
 {
    unique_ptr<string> p1(new string("I'm Li Ming!"));
    unique_ptr<string> p2(new string("I'm age 22."));
        
    cout << "p1:" << p1.get() << endl;// p1:0x192a070
    cout << "p2:" << p2.get() << endl;// p2:0x192a0a0

    // 报错: error: use of deleted function ‘std::unique_ptr,赋值运算符是delete的
    // p1 = p2;                    // 禁止左值赋值
    
    // 报错: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&)
    // 拷贝构造函数也是=delete的
    // unique_ptr<string> p3(p2);    // 禁止左值赋值构造

    unique_ptr<string> p3(std::move(p1));
    p1 = std::move(p2);    // 使用move把左值转成右值就可以赋值了,效果和auto_ptr赋值一样

    cout << "p1 = p2 赋值后:" << endl;
    cout << "p1:" << p1.get() << endl; // p1:0x192a0a0
    cout << "p2:" << p2.get() << endl; // p2:0
    cout<< "p3: " << p3.get()<<endl;// p3:0x192a070
    cout<<endl;
}

 

标签:auto,move,左值,unique,ptr,赋值
From: https://www.cnblogs.com/BlueBlueSea/p/18203118

相关文章

  • 配置AutoFacManger.cs
    使用配置AutoFacManger的好处是不用我们像之前一样写一层注入一层,这样自动注入只要我们命名规范的话,就可以实现不在用去Program中手动后注入创建一个类里边写  publicclassAutoFacManger:Autofac.Module{///<summary>///自动注入......
  • ptrace attach 修改进程内存
    #include<stdio.h>#include<stdlib.h>#include<sys/ptrace.h>#include<stdint.h>#include<errno.h>#include<sys/wait.h>intmain(intargc,char*argv[]){ void*addr1; void*addr2; pid_tattack_pid=-1; if(......
  • 《RandAugment: Practical automated data augmentation with a reduced search space
    论文标题《RandAugment:Practicalautomateddataaugmentationwithareducedsearchspace》随机增强:缩小搜索空间的实用自动数据扩增技术作者EkinD.Cubuk、BarretZoph、JonathonShlens和QuocV.Le来自GoogleResearch,BrainTeam初读摘要最近的研究表明,数......
  • shared_ptr的概念和一些特性调查
    shared_ptr概念shared_ptr是C++11中引入的一种智能指针,用于自动管理资源,特别是动态分配的内存。它属于头文件中定义的智能指针类之一,用于解决动态内存分配中的内存泄漏和资源生命周期管理问题。shared_ptr通过引用计数机制来实现多个shared_ptr实例共享同一资源。具有......
  • ABP 框架 AutoMapper 映射实体时提示 Unmapped members were found 缺少 FullAuditedE
    在配置MapperProfile的时候, 运行提示映射出错:对于Workflow->WorkflowDto和CreateUpdateWorkflowDto->Workflow的映射,存在没有映射的属性 IsDeleted,DeleterId,DeletionTime,LastModificationTime,LastModifierId,CreationTime和CreatorId。我之前写代码都没有映射这......
  • ASP.NET Core Web中使用AutoMapper进行对象映射
    前言在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂、庞大的时候还容易出现错误。为了解决这个问题,对象映射库就随之而出了,这些库可以自动完成对象之间的映射,从而减少大量......
  • Springcloud学习笔记66---@Autowired注入为null的几种情况
    1.在应用的Filter或Listener中使用了@Autowired原因:因为Filter和Listener加载顺序优先于spring容器初始化实例,所以使用@Autowired肯定为null了~~解决:用ApplicationContext根据bean名称(注意名称为实现类而不是接口)去获取bean,随便写个工具类即可2.你写的代码有问题,没加@Service、......
  • 题解:CF1954F Unique Strings
    link计数类*3100首次独立过纪念版题解。首先我们考虑一个去重的问题。貌似针对循环同构去重的问题,只能从循环节上入手。那么我们考虑设\(dp(d)\)为最小循环节长度恰好为\(d\)不同方案数个数,则答案为:\[\sum_{d=1}^ndp(d)=\sum_{d|n}\frac{dp(d)}{d}\]这似乎是一条可行......
  • autofs配置
    NFS配置:[root@localhost~]#echo"/aa*(rw)">>/etc/exports[root@localhost~]#mkdir/aa&&chmod777-R/aa[root@localhost~]#systemctlstartnfs&&systemctlenablenfs 客户端autofs配置[root@localhost~]#yuminstall-ya......
  • Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?
    @Autowired和@Resource都是JavaSpring框架中的注解,用于实现依赖注入(DI)和控制反转(IoC)。它们的区别主要在以下三个方面:源头不同 @Autowired是Spring自带的注解,而@Resource是JSR250规范中定义的注解。因此,在使用Spring框架的时候,通常建议使用@Autowired注解。  查找顺序......