目录
内存四区
代码区
全局区
栈区
堆区
内存四区意义:
程序运行前后内存变化
程序运行前
代码区
全局区
程序运行后
栈区
堆区
new操作符
基本语法
创建
释放(delete)
内存四区
代码区
代码区(Code Segment):存放程序的机器指令,包括函数体的二进制代码。这部分内存由操作系统进行管理,是只读的,不允许修改。
全局区
全局区(Global/Data Segment):存放全局变量、(static)静态变量以及(const)常量数据。全局变量和静态变量在程序运行期间始终存在,而常量数据则通常存储常量字符串等不可修改的数据。这部分内存在程序启动时分配,在程序结束时释放。
栈区
栈区(Stack):用于存储函数的参数值、局部变量以及函数调用时的上下文信息,由编译器自动分配和释放,具有后进先出(LIFO)的特点。在函数调用时,会为每个函数帧(函数调用的上下文)分配一段栈空间,函数返回后会自动释放该空间。
堆区
堆区(Heap):用于动态分配内存,程序员可以通过手动管理来申请和释放堆内存。堆区的内存分配和释放不受函数调用的限制,需要程序员显式地使用
new
和delete
、malloc
和free
等操作符来进行内存的分配和释放,若程序员不释放,程序结束时由操作系统回收。堆区的内存空间是不连续的,大小相对较大。
内存四区意义:
不同区域存放的数据,被赋予了不同的生命周期, 让我们可以更灵活地编程
(帮助我们合理管理内存资源,提高程序的性能和可维护性)
程序运行前后内存变化
程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为全局区和代码区两个区域
代码区
存放 CPU 执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区
全局变量和静态变量存放在此.(全局变量、static 静态变量)
全局区还包含了常量区, 字符串常量和其他常量也存放在此. (const 常量等)
该区域的数据在程序结束后由操作系统释放
程序运行后
多了堆区和栈区,栈和堆是在程序运行时动态创建的。在程序运行时,根据需要会动态地为局部变量、函数调用等分配栈空间,而堆则用于动态分配内存。
栈区
栈区是由编译器自动分配和释放的,用于存储函数的参数值、局部变量等数据。栈的分配和释放遵循后进先出的原则(LIFO)。当程序执行到一个函数时,该函数的参数会被压入栈中,并在函数执行完毕后自动释放。同样,函数内部的局部变量也会在函数执行完毕后被自动销毁。
注意:在栈区分配的数据不应返回其地址,因为一旦函数执行结束,栈上的数据将被清除,这意味着返回局部变量的地址可能会导致访问已经释放的内存,引发未定义的行为。为了避免这种情况,应始终返回指向堆上动态分配的内存的地址,或是返回全局变量的地址。
堆区
堆区是由程序员手动分配和释放的,需要注意的是如果程序员没有及时释放堆区的内存,那么在程序结束时,操作系统会回收这些内存。
一般使用
new
关键字来在堆区动态地分配内存,通过new
分配的内存将在堆区中创建,并返回该内存的地址。我们可以使用指针来保存这个地址,并在适当的时候使用delete
关键字释放对应的内存。需要注意的是,在使用堆区的内存时,要确保正确分配和释放内存,否则可能会导致内存泄漏或者因释放已释放内存而产生悬空指针。
new操作符
new
是C++中用于动态分配内存的操作符。它可以用来在堆区(也称为自由存储区)上创建对象或数组。(程序员手动开辟,手动或者程序结束时自动释放,释放内存利用操作符 delete)
基本语法
new 数据类型
文章来源:https://www.toymoban.com/news/detail-609681.html
利用new创建的数据,会返回该数据对应的类型的指针文章来源地址https://www.toymoban.com/news/detail-609681.html
创建
//动态创建单个对象:
Type* pointer = new Type;
//Type* pointer = new Type(a);
//动态创建数组:
Type* array = new Type[size]{a,b,c};
//Type* array = new Type[size];
释放(delete)
//释放对象
delete pointer;
//释放数组
delete[] array;
到了这里,关于Day 9 C++ 内存分区模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!