首页 > 编程语言 >c++ 智能指针

c++ 智能指针

时间:2022-08-22 20:48:15浏览次数:146  
标签:std auto c++ 智能 new unique ptr 指针

智能指针,是模板类,意在避免在使用动态内存时,出现异常等意外,或忘记使用delete,而造成内存泄漏。 这个智能指针,在指针变量结束声明周期后,调用对象的析构函数,并自动去释放这个指针指向的内存块。 智能指针我了解的有auto_ptr、unique_ptr、shared_ptr,各有特点。

{
        std::auto_ptr<Report> ps(new Report("using auto_ptr"));
        ps->comment();
    }
    {
        std::unique_ptr<Report>ps(new Report("using unique_ptr"));
        ps->comment();
    }
    {
        std::shared_ptr<Report>ps(new Report("using shared_ptr"));
        ps->comment();
    }
一、auto_ptr与unique_ptr的比较 这两个都是独享指针。auto_ptr 不能创建 std::auto_ptrdArr(new double[1])这种类型的指针变量。
std::auto_ptr<Report>autoR1(new Report("test Auto"));
    std::auto_ptr<Report>autoR2;
    autoR2 = autoR1;
   // autoR1->comment();
这里的代码 autoR2 = autoR1;作为普通的指针,没有深拷贝函数,赋值之后,autoR1就成了悬挂指针,已经不指向原来的内存了。编译能通过,去掉注释报运行错误。
std::unique_ptr<Report>uPs(new Report("test unique_ptr"));
    std::unique_ptr<Report>uPs2;
   // uPs2 = uPs; //编译通不过
unique_ptr像上面那样赋值,直接通过不编译。可以创建std::unique_ptrarr(new int[5]);这种指针变量 二、shared_ptr 有一个引用计数。
std::shared_ptr<int[]>arr2(new int[3]);
    arr2[0] = 2;
    std::cout << arr2[0] << "\n";
    std::shared_ptr<int[]>arr3 = arr2;
    arr3[0] = 4;
    std::cout << arr2[0] << "\n";
arr3=arr2,这里,引用计数加1.只有当引用计数为0的时候,才会释放这些分享指针指向的内存位置。 所以这里赋值不会有悬挂指针。 测试环境 vs2019及默认的编译器版本。

标签:std,auto,c++,智能,new,unique,ptr,指针
From: https://www.cnblogs.com/HelloQLQ/p/16614171.html

相关文章

  • 【C++-笔记】访问说明符public、protected和private的用途和区别
    在C++当中,访问说明符主要在如下两个场景中使用:成员访问说明符当我们在定义/声明一个类时,需要使用成员访问说明符来说明成员的访问权限,public、protected和private的区别......
  • 从C过渡到C++——换一个视角深入数组[真的存在高效吗?](2)
    从C过渡到C++——换一个视角深入数组[真的存在高效吗?](2)C风格高效的数组遍历在过渡到C++之前我还是想谈一谈如何书写高效的C的代码,这里的高效指的是C代码的高效,也就是在不......
  • rk3566 linux编译运行librga C++程序
    本文使用的是linuxaarch64版librga.so(1.3.2),来自https://github.com/airockchip/librga 运行环境:rk3566linux系统编译环境:ubuntu20.04gcc/g++9.4工具链:gcc-buildroot......
  • c++ 跑酷小游戏之用户体验plus
    #undefUNICODE#undef_UNICODE#include<iostream>#include<iomanip>#include<string>#include<cstdlib>#include<ctime>#include<windows.h>#include<conio.h>#inc......
  • 经纬恒润全链路测试平台,助力智能驾驶技术落地应用
    汽车智能化浪潮汹涌而来,但智能驾驶汽车在真正商业化应用前,需要经历大量的道路测试才能达到商用要求。作为新兴事物,智能驾驶汽车仍面临着大量问题需要克服,如道路测试的时间......
  • 学习MFC遇到的问题(VC++深入详解)
    1.关于动态链接库dll编写:VS2015中用C++创建MFCDLL动态库2.【C++】Debug模式和Release模式的区别:3.也是一个靓仔实现的window的txt,使用CEditView:MFC单文档框架建立4.w......
  • effective c++注意点
    item2: item3:  只有被const修饰过的成员函数才能操作const变量......
  • C 语言-7 指针
    7.1地址指针简单认识地址(指针):为了正确地访问内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。通常也......
  • C++ 炼气期之结构体
    1.前言随着计算机向着不同领域的延伸,数据的概念已经不仅局限于数值型数据,计算机需要处理大量的非数值、且复杂的类型数据。为了能抽象地描述这些非数值、复杂类型的数据......
  • 关于C/C++的Warning解释
    关于C/C++的Warning解释如何发现更多Warning在编译时加上命令-Wall和-Wextra即g++a.cpp-oa.out-Wall-WextraWarning是极为有用的,可以提醒你一些意想不到的问题......