IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++笔记 -> 正文阅读

[C++知识库]C++笔记

一、智能指针

? ? 常规指针的缺点:

? ? ? ? 当一个常规指针离开了作用域时,只有该指针变量所占用的内存空间(4字节/8字节)被释放,而它所指向的内存空间不会被释放,当free\delete\delete[] 语句无法执行、或者忘记执行时

? ? ? ? 就会导致内存泄漏

? ?

? ? 智能的优点:

? ? ? ? 智能指针是一个封装了常规指针的类类型对象,封装了 * -> 运算符

? ? ? ? 当智能指针离开了作用域时,它的析构函数就会自动释放,析构函数中执行了常规指针的释放操作,从而做到了自动释放内存的效果,避免了内存泄漏

? ? 智能指针与常规指针的相同点

? ? ? ? 智能指针虽然是类对象,但是它重载了* -> , 因此在使用时可以像常规指针一样使用

? ? C++STL中提供了四个智能指针:auto_ptr\unique_ptr\shared_ptr\weak_ptr

? ? 其中C++98只有第一个,C++11中只支持后三个,第一个被弃用了,使用会产生警告

? ? 需要提供头文件 <memory>

? ? 1、auto_ptr

? ? ? ? 采用独占式拥有模式,不能同时有多个auto_ptr指向同一个资源,但是又不能完全限制指向操作,因此有隐患,并且不能放入容器

? ? ? ? auto_ptr<类型> p1(new 类型(初始值));

? ? ? ? cout << *p1 << endl; ? ?//访问内存

? ? ? ? auto_ptr<类型> p2;

? ? ? ? p2 = p1; ? ?//不报错,p1转移所有权给p2

? ? ? ? cout << *p1 << endl; ? ?//空指针解引用

? ? 2、unique_ptr ? 独享指针

? ? ? ? 相当于auto_ptr的升级版本,完全实现了独占式拥有模式,保证同一时间内只有一个

? ? ? ? unique_ptr指向某一个资源,通过把拷贝构造函数、赋值操作函数声明为delete来实现独占的效果

? ? ? ? unique_ptr<类型> p1(new 类型(初始值));

? ? ? ? cout << *p1 << endl; ? ?//访问内存

? ? ? ? unique_ptr<类型> p2;

? ? ? ? p2 = p1; ? ?//报错

? ? ? ? p2 = unique_ptr<string>(new string("xixi"));//不报错,允许临时对象的赋值

? ? ? ? unique_ptr<string> p3;

? ? ? ? p3 = move(p1);//p1NULL p3指向原p1内存

? ? ? ? 注意:如果想要转移使用权,可以使用C++标准库函数move进行

? ? 3、shared_ptr ? 共享指针

? ? ? ? 采用共享式的拥有模式,让多个share_ptr同时指向相同资源

? ? ? ? 当share_ptr指向某个资源时,在内部有该资源的一个引用计数,并且+1

? ? ? ? 当有别的shared_ptr指向该资源时,原来的引用计数+1

? ? ? ? 当一个shared_ptr离开了作用域时,所指向的资源的引用计数-1,并放弃指向

? ? ? ? 或者当调用了reset成员函数时,放弃指向资源,引用计数-1

? ? ? ? 当该资源的引用计数为0时,最后一个shared_ptr在结束前自动释放资源内存

? ? ? ? 相关成员函数:

? ? ? ? ? ? use_count() 返回引用计数的数量

? ? ? ? ? ? unique() ? ?返回是否独占资源

? ? ? ? ? ? reset() ? ? 放弃对资源的指向

? ? ? ? ? ? swap() ? ? ?标准库函数,交换两个指针指向

? ? ? ? ? ? get() ? ? ? 返回内部对象(指针)

? ? ? ? shared_ptr的循环引用问题:

? ? ? ? ? ? 当有两个类,都有可以指向对方类型的共享指针成员变量,并且在类外分别通过另外两个共享指针指向new出来的这两个类对象,并且让它们内部的共享指针成员变量分别指向对方类对象,

? ? ? ? ? ? 此时就构成了shared_ptr的循环引用死锁,无论如何都无法调用两个类对象的析构函数,导致内存泄漏

? ? 4、weak_ptr 弱引用指针

? ? weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的资源,但是不影响该资源的生命周期,也即是weak_ptr指向一个由shared_ptr管理的资源时,shared_ptr

? ? 的引用计数不会改变

? ? 无论是否由weak_ptr指向,一旦指向资源的shared_ptr计数为0,资源就释放,weak_ptr更像是shared_ptr的助手

? ? 因此当shared_ptr因为循环引用产生死锁问题时,把其中一个类的shared_ptr成员变量 变为 weak_ptr 即可解决问题

? ? ? ?

二、C++的异常处理

1、什么是异常:

? ? 当代码出错时,停止执行,返回一个数据

? ? C语言中调用者只能通过使用、接收返回值的方式处理错误、异常

? ? C++中可以接收自己返回或者系统返回的返回值,根据返回数据的类型不同,从而执行不同的错误、异常处理语句

2、如何抛异常

? ? throw 数据;

? ? 数据可以是任何类型,不要去抛局部变量的地址或引用

3、如何捕获异常

? ? try{

? ? ? ? //可能会产生异常的代码或者函数调用

? ? }catch(类型名& 变量名){

? ? ? ? //处理错误

? ? }

4、异常说明

? ? 返回值 函数名(参数列表) throw(类型1,类型2,...)

? ? {

? ? }

? ? 异常说明相当于该函数的限制或者承诺,只能抛出说明过的异常类型,如果函数抛出了异常说明外的异常类型,运行时无法捕获并会产生运行错误

5、标准异常

? ? C++中已经定义好的异常类,当对应的异常发生后,会自动抛出定义好的异常类对象

? ? exception 该异常是所有标准 C++ 异常的父类,能捕获所有的标准异常

? ? bad_alloc 该异常可以通过new 抛出(内存不够),如果是C++11,会抛出它的子类bad_array_new_length

? ? bad_cast 该异常可以通过 dynamic_cast 抛出

? ? bad_exception 这在处理C++ 程序中无法预期的异常时非常有用

? ? bad_typeid ?该异常可以通过 typeid 抛出

? ? logic_error 理论上可以通过读取代码来检测到的异常

6、自定义异常类

? ? ZZError(const string& erro,const string& file,const string& func,const size_t& line,const string& time):

? ? time(time),file(file),func(func),line(line),erro(erro) {}

7、使用异常需要注意的问题

? ? 1、不要返回局部变量、对象的地址、引用,但可以返回临时对象

? ? 2、建议都用引用的方式进行捕获异常,否则会构造、拷贝两次

? ? 3、不要在构造函数、析构函数抛异常

? ? 4、如果存在父子类异常,先捕获子类类型,再捕获父类类型

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:06:35  更:2022-11-05 00:10:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:26:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码