C++Prime 12章学习笔记

疫情期间在家准备复试,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必须指向一个动态分配的数组或者为空
发布了1 篇原创文章 · 获赞 0 · 访问量 80

猜你喜欢

转载自blog.csdn.net/qq_33522787/article/details/104547425