首页 技术 正文
技术 2022年11月9日
0 收藏 561 点赞 4,894 浏览 1128 个字

C++中的动态内存管理是通过new和delete两个操作符来完成的。new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针。delete调用时,销毁对象,并释放对象所在的内存。但在程序中使用new和delete容易导致很多问题,这里列出三个比较容易犯的错误。

  1. 我们new了一个对象,但没有delete它。这会引起memory leak内存泄露,可能会导致程序崩溃。
  2. 用指针访问一个已经被free的对象。这就是我们常说的dangling pointer。
  3. delelte同一个内存区域两次。如果两个指针指向同一个内存区域,那我们delete一个指针后,再用另一个指针访问其指向的内存区域就会出现问题。

为了解决上面的问题,方便动态内存管理,c++提出了smart pointer的概念,在STL库中对应的实现主要有两种:shared_ptr、unique_ptr。下面我们主要介绍这两种smart pointer。

  1. shared_ptr:是一个模板类,定义在<memory>头文件里。shared_ptr对象会在其作用域结束时,自动销毁,如果该shared_ptr是指向某对象A的最后一个shared_ptr,那么A所在的内存会被释放。应用举例:shared_ptr<int> p(new int(4)); 或者用make_shared<T>()函数生成shared_ptr,shared_ptr<int> p = make_shared<int>(4)。
  2. unique_ptr:也是一个模板类,同样定义在<memory>头文件里。与shared_ptr不同的是,unique_ptr是自己”拥有“一个指向的对象,也就是说不同有两个或者以上的unique_ptr指向同一个对象。在一个unique_ptr对象的作用域结束时,unique_ptr指向的对象的内存被释放。为了保证unique_ptr对对象的独有性,赋值、复制操作是不允许的。但有一个例外,我们可以在函数中return一个unique_ptr。应用举例:unique_ptr<int> p(new int(4))。unique_ptr是c++11引入的,其之前对应的是auto_ptr,与unique_ptr不同的是,我们不能再函数中返回auto_ptr对象。

在程序中运用smart pointer还有一个优点,就是smart pointer保证其指向的动态内存被释放不论程序是否正常结束,而new和delete不能保证这一点。shared_ptr和unique_ptr在释放对象内存时默认用delete,不过我们可以指定自己的deleter,具体内容可参考C++ Primier Dynamic Memory部分。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295