c++ 内存
内存分区
1.代码区:程序的机器指令,可以被机器直接执行。
属性:只读和共享
代码区包含什么:
在程序编译时就已经被分配好了地址,并保存在可执行文件的代码段中。当程序运行时,操作系统会将代码段的内容读入内存,并将其中的指令加载到指令缓存器(Instruction Cache)中,以供处理器执行。
代码区的分配
代码区是在程序编译时分配的。当程序编译完成后,编译器会将程序的代码生成一个二进制文件。在程序运行时,操作系统会将该二进制文件读入内存,并将代码区的内容加载到指令缓存器(Instruction Cache)中。
2.全局区:全局变量和静态变量和字符串常量的内存区
它在程序编译时就已经被分配好了地址,并保存在可执行文件的数据段中。
全局变量能够自动初始化为0和null。全局变量在载入内存时候就被初始化了,而静态变量在首次使用时才会被初始化。
在全局数据区中定义的变量可以被程序的任何部分访问,包括全局函数、局部函数和其他模块。
在程序运行期间,全局数据区中的变量始终存在于内存中,它们的生命周期与程序的运行时间相同。
3.栈区:局部变量和函数调用时的参数、返回地址
4.堆区:new和malloc创建的
在 C++ 中,内存分配可以分为静态分配和动态分配两种方式,除了new和malloc是动态的,其他都是静态的。
使用 new 和 delete 运算符或者 malloc 和 free 函数进行动态内存分配和释放。
new:都是返回地址的指针
new 的语法格式如下:
new Type; // 分配单个对象的内存空间
new Type[N]; // 分配 N 个对象的内存空间
使用new动态分配内存并初始化基础变量时,可以使用括号初始化法来将其初始化为0,如下所示:
int* p = new int();
这样分配的内存会被初始化为0。
对于内置类型,可以使用下列语句创建并初始化元素为0的数组:
int* arr = new int10; // 创建并初始化10个元素为0的int型数组
对于指针类型,可以使用下列语句创建并初始化元素为null的数组:
int** arr = new int*10; // 创建并初始化10个指向int的指针的数组,初始值均为null
delete:释放new创建的指针指向的位置
delete 的语法如下:
delete pointer; //pointer 是之前通过 new 动态申请的内存的指针。
pointer=NULL;
delete pointer[]; //可以使用 delete[] 释放整个数组。
delete & 对象。是 C++ 中用于释放动态分配的对象的内存的运算符。而不是指针的。
运行时,将代码和数据都要加载到内存中。
1.代码段(code segment)text,存储代码。只读,存储指令。
2.数据段(data segment)存放已经初始化的全局变量和静态变量。
3.BSS段(BlockStarted by System)未初始化的全局变量和静态变量,重新启动时会将指针和值初始化为0.
4.Heap堆,malloc和calloc分配的地址。
5.stack堆栈。
静态变量和全局变量除了作用域不一样,剩下的全是相似的。