(一)C++的内存管理
前言:提到内存管理,大概会想到:堆、栈、内存、溢出全局变量、局部变量、静态变量、智能指针、new、deletet、malloc、初始化、NULL等等。
还会想到一句话:记得释放不用的资源,避免资源泄露!
我认为:C/C++是操作十分丰富的语言,但只要长期规范使用,就OK了。
另外,需要对一些基本概念了然于胸,如:
(1)不同变量的内存分配位置,访问权限、生命周期;
(2)灵活运用语言,规范使用语言。
1.五大存储区
堆:一大段可分配的存储空间,由操作系统管理,可以用new等方式得到一块内存区使用。
栈:就是函数里定义的那些变量(特殊除外,比如一些静态、常量、堆、自由等)。
全局/静态:就是在函数体外或者使用static定义的变量,二者的作用域是不同的。
自由:malloc之类的吧,不过这一块其实可以划分到堆区。
常量:一些初始化的字符串、const定义的变量等等
2.XXX的生命周期
这点还能重要,比如栈中变量的生命周期很短暂,函数执行完会自动pop,那么这块资源又可以被重新利用类。
比如在函数中定义static的变量生命周期变的和全局变量一样。
比如new的XXX,要delete手动结果它。
以上说的都是程序运行时,在程序over的时候,OS肯定会保护自己可怜的内存,去释放。
3.new与delete
new是个好东西,可以为XXX拿到一块内存空间来使用,但是要记得不用的时候delete掉,把内存资源还给OS。
new可以这样用:
(1)给指针变量new一个类型的内存大小
int *pint = new int;
*pint = 10;
delete pint;
(2)给指针变量new一个class的大小
classname *a = new classname;
delete a;
(3)给指针变量new一个数组
//一维
int *a = new int[5];
delete [] a;
//二维
//5*3
int **arr = nullptr;
arr = new int *[5];
for (int i = 0; i < 5; ++i) {
arr[i] = new int[3];
}
//....opt arr
for (int i = 0; i < 5; ++i) {
delete [] arr[i];
}
delete [] arr;
4.堆栈大小限制
在五大存储区中,一般为们会比较关注堆栈是否溢出。
就栈来说,不要讲大内存变量在函数中定义,并且不要函数潜逃太深,尤其在嵌入式中,资源太少了,Linux下会来一些,大概有8-10M吧。
堆的大小是比栈大的多,但是也不要太浪费,记得手动释放,在析构函数中释放资源吧。
堆栈大小都是可以查看的,最好不要修改。
5.老生常谈的初始化
在定义一个指针的时候应该将其初始化,尤其是暂时不用到的初始化为nullptr;
不然指针乱飞就很恐怖类,虽然OS对关键区域有权限访问措施,但是“只有一个心脏怕也活不长”。
6.智能指针
智能指针实际上是将指针封装在一个类里,通过对象来管理指针,使得其生命周期结束时就over,而不用手动delete。
在C++库中最重要的类模板之一!
常见智能指针:
#include <memory>
auto_ptr: auto_ptr<int> p1(new int(10)); //定义一个智能指针p1指向一个int型变量,该变量的值初始化为10.
std::shared_ptr:shared_ptr<int> p2(new int(20));
weak_ptr:
unique_ptr:
1716

被折叠的 条评论
为什么被折叠?



