行业知识
C++内存管理
���录
一、内存的划分
1.各个内存区域
2.小练习
二、C++的动态内存管理
1.new和delete的引入
2.new和delete的使用
3.内存泄漏
三、深入了解new和delete关键字
1.operator new与operator delete函数
2.定位new(了解)
一、内存的划分
1.各个内存区域
程序的运行需要内存,对于我们以前常用的32位操作系统,指针变量的大小为四字节,地址个数一共有2的32次方个,每一个字节加起来就是4G;而对于我们现在常用的64位操作系统,指针变量的大小为八字节,地址个数一共有2的64次方个,每一个字节加起来理论上是17179869184G,也就是16777216T,但是我们现在使用的电脑普遍是8G或者16G内存,所以内存空间对于地址的利用并不完全。
我们为了有效地使用内存,避免程序读写遇到空间上的冲突。就需要将内存划分为不同的区域,主要包括:内核空间、栈、堆、内存映射段、数据段、代码段。
- 内核空间:类似于之前Linux讲的内核kernel,这是操作系统工作的空间我们一般人不能操作
- 栈:栈又叫堆栈,栈区中主要存放函数的返回值/函数的参数/非静态的成员变量,栈的特点是向下增长的(从栈申请的内存地址会越来越小)。
- 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
- 堆区:主要要用于程序的动态开辟,堆的特点是向上增长的。
- 数据段:存放全局变量和静态变量。
- 代码段:存储可执行文件的指令(定义过的函数等)和只读常量。
注意这里格子的大小不代表每个区域空间的大小。
2.小练习
根据下图中的代码选择数据的储存位置
(1)选择题:
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里?____ staticGlobalVar在哪里?____
staticVar在哪里?____ localVar在哪里?____
num1 在哪里?____
char2在哪里?____ *char2在哪里?___
pChar3在哪里?____ *pChar3在哪里?____
ptr1在哪里?____ *ptr1在哪里?____
(2)填空题:
sizeof(num1) = ____;
sizeof(char2) = ____; strlen(char2) = ____;
sizeof(pChar3) = ____; strlen(pChar3) = ____;
sizeof(ptr1) = ____;
选择题答案:
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里?C(全局变量) staticGlobalVar在哪里?C(静态变量)
staticVar在哪里?C(静态变量) localVar在哪里?A(局部变量)
num1 在哪里?A(数组名是首元素地址,也在栈区)
char2在哪里?A(数组名是首元素地址,也在栈区) *char2在哪里?A(数组内容储存在栈区)
pChar3在哪里?A(地址储存在栈区) *pChar3在哪里?D(abcd是一个常量字符串,pChar3指向代码段内的这个常量字符串)
ptr1在哪里?A (地址储存在栈区) *ptr1在哪里?B(内容在堆区)
填空题答案:
sizeof(num1) = 40; (整个数组大小)
sizeof(char2) = 5(还有一个\0); strlen(char2) = 4;(不包含\0)
sizeof(pChar3) = 4/8;(指针都是4/8字节) strlen(pChar3) = 4;(不包含\0)
sizeof(ptr1) = 4/8;(指针都是4/8字节)二、C++的内存管理方式
二、C++的动态内存管理
1.new和delete的引入
在C语言中,我们主要用malloc、calloc、realloc三个函数开辟堆区空间,用free释放空间。
在C++中又引入了new和delete进行内存开辟与释放。
#includeusing namespace std;int main(){ int* p1 = (int*)malloc(sizeof(int)); free(p1); int* p2 = new int; delete p2; return 0;}上下两行代码起到的作用是一样的,上下都是开辟int类型大小的空间用p1和p2指针维护,然后释放空间。
2.new和delete的使用
new和delete的使用对于内置类型其实没有太多的优化,主要对于类类型申请空间更加方便。
#includeusing namespace std;class Date{public: Date(int year = 2000, int month = 1, int day = 1) :_year(year) , _month(month) , _day(day) {} void Dateprint() { cout
上一篇:怎么修改APP的服务器数据?
下一篇:ps怎么连接育碧服务器?