每一个应用都有本身独立的内存空间--今天不会讲太多代码,主要是理论。
复制代码
每一个应用都有本身独立的内存空间,其内存空间通常都有如下几大区域
栈空间,堆空间,代码区,全局区,其实咱们主要关心的是堆区,由于咱们的代码的声明周期都在堆区里完成。
复制代码
名 称 | 说明 | 做用 |
---|---|---|
堆空间 | 每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间 | 自动分配和回收 |
堆空间 | 须要主动去申请和释放 | 好比类的对象的建立 |
代码区 | 代码段(代码区) | 用于存放代码 |
全局区 | 数据段(全局区) | 用于存放全局变量等 |
在程序运行过程,为了可以自由控制内存的生命周期、大小,会常常使用堆空间的内存
堆空间的申请\释放
malloc \ free
new \ delete
new [] \ delete []
是否是有点速度快,Java和OC中局可使用new来初始化一个对象。
来看几个栗子
// 没有初始化
int *p1 = new int;
// 初始化为0
int *p2 = new int();
// 初始化为5
int *p3 = new int(5);
// 没有初始化
int *p4 = new int[3];
// 所有元素初始化为0
int *p5 = new int[3]();
// 所有元素初始化为0
int *p6 = new int[3]{};
// 首元素初始化为5,其余元素初始化为0
int *p7 = new int[3]{ 5 };
这样作有什么问题没,C++ 可没有ARC和GC管理机制
new 这么多的对象,确定形成内存泄露了。
每new一次就要在不使用的时候销毁(delete),要成对出现
int *p = new int;
delete p;
复制代码
定义一个结构体
struct Person {
int m_age;
};
// 全局区
Person g_person;
// 栈空间
Person person;
int main() {
// 栈空间
Person person;
// 堆空间
Person *p = new Person();
p->m_age = 20;
delete p;
//举一个malloc的栗子
Person *p2 = (Person *) malloc(sizeof(Person));
free(p2);
}
复制代码
申请堆空间成功后,会返回那一段内存空间的地址
申请和释放必须是1对1的关系,否则可能会存在内存泄露
如今的不少高级编程语言不须要开发人员去管理内存(好比Java),屏蔽了不少内存细节,利弊同时存在
利:提升开发效率,避免内存使用不当或泄露
弊:不利于开发人员了解本质,永远停留在API调用和表层语法糖,对性能优化无从下手 --奸笑
复制代码
完整代码demo,请移步GitHub:DDGLearningCppgit
固然C++大神就绕吧,非喜勿喷,毕竟这是我的的学习笔记📒github