如何免费制作自己的网站,网站建设源码安装教程,网站维护和推广,做网站好还是做淘宝好众所周知#xff0c;C五大内存区#xff1a;全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区)#xff1a;存放全局变量#xff0c;静态数据和常量#xff1b; 代码区#xff1a;存放所有类成员函数和非成员函数代码#xff0c;函数体的二进制代码。…众所周知C五大内存区全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区)存放全局变量静态数据和常量 代码区存放所有类成员函数和非成员函数代码函数体的二进制代码。 栈区存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。 堆区new、malloc、realloc分配的内存块一般编译器不会释放内存需要用程序释放内存泄露通常说的就是堆区。 常量区存放常量的不允许修改。
其中堆区就是动态内存的区域就是程序员自己分配和释放内存的区域。
1.智能指针
1.1 介绍
头文件#includememory
智能指针是模板。
shared_ptr共享指针允许多个指针指向同一个对象
unique_ptr独占指针只允许一个指针指向一个对象
weak_ptr弱引用指向shared_ptr所管理的对象。
特点智能指针可以自动释放所指向的对象的内存。
1.2 shared_ptr类
形式shared_ptrT ptrname;
特点每个shared_ptr都有一个关联的计数器来记录有多少个智能指针指向这个对象
我们拷贝一个shared_ptr计数器会递增如 1.当用一个shared_ptr初始化另一个shared_ptr 2.当把一个shared_ptr作为参数传递给一个函数 3.当把一个shared_ptr作为一个函数返回值时
我们销毁一个shared_ptr或给一个shared_ptr赋值时计数器会递减如 1.局部shared_ptr离开一个作用域会被销毁则指向这个对象的其它shared_ptr指针的计数器会递减
当计数器为0时(即没有智能指针指向这个对象了)将会调用这个对象的析构函数销毁它并释放内存。
T是一个类型可以是内置类型、容器等等。
操作含义shared_ptrT sp空智能指针指向类型为T的对象sp将sp作为条件判断如果sp指向一个对象则为true否则为false*sp解引用sp获得它指向的对象sp-mem等价于(*sp)-mem调用sp指向对象的成员sp.get()返回sp中保存的指针。注意若智能指针释放了其对象返回的指针所指向的对象也就消失了。 swap(sp1,sp2) sq.swap(sp2) 交换两个智能指针make_sharedT (args)返回一个shared_ptr指向类型为T的对象。并且使用args对对象进行初始化。这是最安全的分配和使用动态内存的方法。shared_ptrT sp (sq)sp是sq的拷贝此操作会递增sq的计数器。sq中的指针必须能转换为T*spsqsp是sq的拷贝此操作会递增sq的计数器递减sp的计数器。sp.unique()若sp.use_count为1则为true否则则为falsesp.use_count()返回与sp共享对象的智能指针数量。可能会很慢。
注意 由于在最后一个shared_ptr销毁前这个对象不会被销毁所以就需要保证当这个shared_ptr在后面不会再使用的时候就要销毁它。如一个容器里存有多个shared_ptr但是用到后面我只需要使用其中的一部分shared_ptr这时候我就要调用容器的erase函数来将不用的shared_ptr给销毁掉避免内存浪费。
1.3 unique_ptr类
操作含义unique_ptrT up空智能指针指向类型为T的对象up将up作为条件判断如果sp指向一个对象则为true否则为false*up解引用up获得它指向的对象up-mem等价于(*up)-mem调用up指向对象的成员up.get()返回up中保存的指针。注意若智能指针释放了其对象返回的指针所指向的对象也就消失了。 swap(up1,up2) up.swap(up2) 交换两个智能指针
2.动态内存
2.1 使用动态内存资源的类
一般在以下情况下程序要使用动态内存资源 1.程序不知道这个类需要分配多少对象。如容器 2.程序不知道所需对象的准确类型。 3.程序需要在多个对象间共享数据。
3.动态内存与智能指针