ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++Prime 12章学习笔记

2020-03-04 18:36:33  阅读:195  来源: 互联网

标签:Prime 12 get int C++ 智能 new ptr 指针


疫情期间在家准备复试,C++学习效率极低。从12章开始感觉看的越来越困难。做个笔记慢慢啃。

第12章动态内存

12.1动态内存与智能指针

12.1.1share_ptr类

该智能指针的使用方式和普通指针类似。解引用一个智能指针返回它指向的对象。如果在一个条件判断中使用智能指针,效果就是检测它是否为空。

if(p1&&p1->empty())//判断p1是否为空以及其指向的内容是否为空
   *p1 = "hi" //如果p1指向的内容为空,解引用p1,为其赋值

在使用share_ptr类的时候,需要注意get方法

p.get() //返回p中保存的指针,若智能指针释放了其对象,返回的指针也消失

make_share函数是最安全的分配和使用动态内存的方法

share_ptr的拷贝和赋值,当进行拷贝和赋值操作时,引用计数加1,当离开作用域时,计数减一,计数为0时便销毁。

另复习知识:
const在函数后面, 在定义类的函数时,有一类函数不改变类的数据成员。也就是说,这些函数是只读函数。已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。

12.1.2 直接分配内存

C++定义了两个运算符来释放和分配内存, new 和 delete
new 为分配的对象返回一个指向分配对象的指针。

int *pi = new int;
int *pi = new int(1024); //pi指向的对象为1024
string *ps = new string(10, '9'); //ps指向的对象为999999999

为了防止内存耗尽,在使用完内存后通过delete表达式来释放内存。

注意,由内置指针(而不是智能指针)管理的动态内存在被显式释放前会一直存在。

12.1.3 shared_ptr和new结合使用

需要注意的是,不能将智能指针和普通指针混合使用

shared_ptr<int> p2(new int(42)) //只能采用这种方式来创建智能指针

同时,不能使用get来初始化另一个指针或者对智能指针赋值。
get用来将指针的访问权限传递给代码,当代码不会delete指针的时候才能够使用get,用get给智能指针赋值是不可行的。

12.1.4 智能指针和异常

在因为异常退出,智能指针会自动销毁

附:智能指针注意事项
1.不使用相同的内置指针值初始化(或reset)多个智能指针。
2.不delete get( )返回的指针。(p.get( )返回p中保存的指针。要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了)
3.不使用get()初始化或reset另一个智能指针。
4.如果使用get( )返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变成无效了。
5.使用智能指针管理的资源不是new分配的内存,记住传递给他一个定制的删除器。

12.1.5 unique_ptr

unique_ptr 在同一时间只能有一个指针指向对象。
与shared_ptr不同,只能将其绑定到new返回的指针上,类似shared_ptr。

unique_ptr<int> ps(new int(42));

同时,我们可以使用release和reset 将指针的所有权从一个(非const)unique_ptr传递给另一个指针

unique_ptr<string> p2(p1.release())//将p1指向的内存传递给p2
unique_ptr<string> p3(new string("Trex"));
p2.reset(p3.release()); //将p3指向的内容传递给p2

同时,类似于shared_ptr,我们可以向unique_share 传递一个删除器。

12.2动态数组

为了让new动态分配一个数组,我们要在类名后跟一对方括号,在其中指明分配对象的数目。

int *pia = new int[get_size()] //方括号内部可以不是常量

分配一个动态数组获得一个元素类型的指针,由于不是数组类型,因此不能用begin()和end()函数。

初始化动态分配对向的数组。

int *pia = new int[10]; //10个未初始化的int
int *pia2 = new int[10]();//10个初始化为0的int
string *psa = new string[10];
string *psa2 = new string[10]();//10个空string

初始化一个空数组是合法的
释放动态数组:
为了释放动态数组,我们使用一种特殊的delete,在指针前加一对空括号对:

delete p; //p必须指向一个动态分配的对象或者为空
delete [] pa; //pa必须指向一个动态分配的数组或者为空

标签:Prime,12,get,int,C++,智能,new,ptr,指针
来源: https://blog.csdn.net/qq_33522787/article/details/104547425

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有