C++入门到精通 ——第四章 智能指针

四、智能指针

Author: XFFer_

01 直接内存管理(new/delete)、创建新工程观察内存泄漏

1 直接内存管理(new/delete)
2 创建新工程,观察内存泄漏

直接内存管理(new/delete)

C语言中是malloc/free

定义初值
int *pointi = new int(100);
string *points = new string(5, 'a');	//"aaaaa"
vector<int> *pointv = new vector<int>{
   1, 2, 3, 4, 5};  

概念 “值初始化”:用()来初始化

int *pointi = new int();
auto pointi_t = new auto(pointi);
//前面的auto推断出的是int **

推荐在delete后将该指针设置成nullptr
C++中出现了智能指针,会帮助程序猿收回内存。

创建新工程,观察内存泄漏

MFC应用程序能够在一定程度上(程序推出的时候),帮助发现内存泄漏。
MFC:微软公司出的基础的程序框架(MFC基础类库),可以生成一个带窗口(带界面)的程序框架,MFC简化了很多界面开发工作。

快捷键 ctrl + ] 跳转到对应的{ }

02 new、delete探秘,智能指针概述、shared_ptr基础

1 new/delete探秘

new/delete是什么
operator new()和operator delete()
基本new如何记录分配的内存大小供delete使用
申请和释放一个数组
为什么new/delete、new[]/delete[]要配套使用

2 智能指针总述
3 shared_ptr基础

常规初始化(shared_ptrnew配合)
make_shared函数

new/delete探秘

new/delete是什么?

new/delete类对象时,有初始化/释放的能力(调用构造函数/析构函数),这些是malloc/free所不能的。

operator new()和operator delete()

new/delete是操作符,operater new()和operator delete()是函数

  • new简单理解为做了两件事:a)分配内存(实际上通过operator new());b)给内存初始化
  • delete也做了两件事:a)反初始化(调用析构函数);b)释放内存(operator delete())
基本new如何记录分配的内存大小供delete使用

不同编译器new内部有不同的实现方式,new内部有记录机制,记录分配出多少内存。

申请和释放一个数组
int *p = new int[2];
delete[] p;
如果申请一个类数组,会在内存中存入该数组中类的个数,以便与调用等量的析构函数。

智能指针总述

  • 裸指针:直接用new返回的指针,强大灵活,但是需要开发者全程维护。
  • 智能指针:理解为“裸指针”进行了包装,能够“自动释放所指向的对象内存”。C++标准库std提供了四种智能指针:
    • 都是类模版
      • auto_ptr(C++98)已经被unique_ptr取代
      • unique_ptr(C++11):独占式指针。同一时间内,只有一个指针指向该对象
      • shared_ptr(C++11):共享式指针。多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被销毁
      • weak_ptr(C++11)用来辅助shared_ptr
  • 用来帮助我们进行动态分配对象(new出来的对象)的生命周期的管理。能够有效防止内存泄漏

shared_ptr基础

常规初始化(shared_ptr和new配合)

每个share_ptr的拷贝都指向相同的内存

工作原理引用计数。只有最后一个指向该内存的shared_ptr不需要再指向该对象时,才会析构这个对象。计数的作用是每增加一个shared_ptrcount + 1,销毁指针到count为0时,就会释放内存。

std::shared_ptr<int> 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值