程序的内存模型

程序的内存模型

  • 程序运行前
  • 程序运行后
  • new操作符

C++程序在执行时,将内存大方向划分为4个区域:

  • 代码区:存放函数体的二进制代码,由操作系统进行管理
  • 全局区:存放全局变量、静态变量以及常量
  • 栈区:由编译器自动分配和释放,存放函数的参数值、局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

使用不同区域来存放不同的数据,能够赋予它们不同的生命周期,使得编程更加灵活。

程序运行前

程序编译后,会生成exe可执行文件,未执行该程序前内存会分为代码区和全局区。

代码区:

  • 存放CPU执行的机器指令
  • 代码区是共享的,对于频繁被执行的程序,在内存中只需要有一份代码即可
  • 代码区是只读的,防止程序意外修改指令

全局区:

  • 全局变量和静态变量存放在此
  • 全局区还包含了常量区,字符串常量和其他常量也存放在此
  • 该区域的数据在程序结束后由操作系统释放

函数体内的普通变量一般为局部变量,函数体外的普通变量一般为全局变量,由关键字static修饰的普通变量为静态变量。

常量可分为字符串常量、const修饰的变量(又可分为全局和局部)及其他常量。
const修饰的全局变量称之为全局常量,const修饰的局部变量称之为局部常量。
全局变量、静态变量、字符串常量、全局常量都放在全局区,局部常量并不放在全局区。

小结:

  • 在C++中,程序运行前内存分为代码区和全局区
  • 代码区的特点是共享和只读
  • 全局区中存放全局变量、静态变量、字符串常量和全局常量

程序运行后

栈区:

  • 由编译器自动分配和释放,存放函数的参数值、局部变量、局部常量等
  • 不要返回局部变量或局部常量的地址,栈区开辟的数据会由编译器自动释放

堆区:

  • 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
  • 在C++中,主要利用关键字new在堆区开辟内存
  • 使用new开辟的堆区内存需要用指针变量接收,因为返回的是地址,而不是数据

new操作符

C++利用new操作符在堆区开辟内存。
堆区开辟的数据,由程序员手动分配和释放,利用delete操作符进行释放。
利用new创建的数据,会返回该数据对应的类型指针。

语法:new 数据类型

#include 

int* func() {
	// 在堆区创建整型数据
	int* p = new int(10);  // new返回的是地址,需要用该数据类型的指针去接收
	
	return p;
}

void test1() {
	int* p = func();
	
	std::cout << *p << std::endl;  // 输出10
    
    delete p;  // 释放堆区数据
    
    // std::cout << *p << std::endl;  // 内存已经释放,再次访问就是非法操作,会报错
}

void test2() {
    int* arr = new int[10];
    
    // 给数组元素赋值
    for (int i = 0; i < 10; i++) {
        arr[i] = i + 100;
    }
    
    // 循环输出数组元素
    for (int i = 0; i < 10; i++) {
        std::cout << arr[i] << std::endl;
    }
    
    delete[] arr;  // 释放堆区数组的时候要加[]
}

int main() {
	test1();
	
    test2();
    
	system("pause");
	
	return 0;
}
---------
10
100
101
102
103
104
105
106
107
108
109

你可能感兴趣的:(C++,开发语言,c++)