前言
本章给大家带来的是C++内存管理。在C语言阶段,我们经常使用malloc,calloc,realloc,free进行内存管理。但是,C语言的内存管理存在很多缺陷,会对程序的稳定性和安全性造成影响。
不过,C语言的内存管理同时也给程序员提供了更大的自由度和灵活性,可以更加精细地控制程序的内存使用。而C++有他自己的一套内存管理,就是:new和delete。
C/C++内存分布
之前我们就学习了c语言的内存管理,我们先来做一段代码题来检验一下是否还记得
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";
const char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}
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) = ____;
为了防止误看到答案,我将答案放到文章末尾,需要的自取哦
各个区域的作用
- 栈——向下生长,生长方向是向下的,也就是向着内存地址减小的方向生长,存储非静态局部变量,函数参数,返回值等
- 堆——用于程序运行时动态内存分配,堆是可以上增长的,,也就是向着内存地址增大的方向增长
- 内存映射段——高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
- 创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
- 数据段——存储全局数据和静态数据
- 代码段——存储可执行代码和常量
int *p=new int[100]
全局作用域中:p在数据段
函数体中:p在栈上
c语言内存管理方式
主要分为malloc,calloc,realloc三种方式
但是无一例外都很麻烦,不但类型要自己确定,大小也要自己确定,使用完还要手动free
而且面对自定义类型,还要自己初始化,实在是很麻烦
针对这种情况,c++提出了new和delete来方便我们的使用
C++内存管理方式
通过new和delete操作符进行动态内存管理
new和delete使用起来其实很简单,下面几行代码就代表了几乎所有的情况
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用
new[]和delete[],一定注意要匹配起来使用,如果不匹配使用在不同编译器下有不同的结果
new和malloc,delete和free的区别
new和delete是操作符,而malloc和free则是函数
new开辟空间后会自动调用构造函数,delete销毁空间后则会自动调用析构函数,这是c++提出new和delete的主要原因
new扩容失败后会抛异常,不用我们手动判断
new和delete的实现原理
new=operator new函数申请空间+调用构造函数,完成对象的初始化工作
delete=operator delete函数释放对象的空间+执行析构函数,完成对象中资源的清理工作
operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的
本质上还是使用了malloc和free函数,不过c++将其封装起来了,方便我们的使用,此处我们就可以体会到封装的力量的强大之处
答案
cccaa
aaadab
40,5,4,4or8,4,4or8
总结
本章主要讲解的是C++
内存管理的知识,具体有:new/delete
,operator new/operator delete
后续将会继续输出有关C++
的文章,你们的支持就是我写作的最大动力!
感谢阅读本小白的博客,错误的地方请严厉指出噢~