C++——内存分区模型

内存大致分为4个区域
1、代码区:存放函数体的二进制代码,由操作系统进行管理,所有代码
2、全局区:存放全局变量和静态变量以及常量
3、栈区:由编译器自动分配释放,存放函数的参数值和变量值
4、由程序员分配和释放,若程序员不释放,程序结束时由操作系统自动回收。


程序运行前:程序编译后生成exe可执行文件,执行前分为两个区域
代码区:
存放CPU执行的机器指令,代码是共享只读的。
全局区:
存放全局变量、静态变量(stattic关键字)、常量(const修饰)、const修饰的全局变量,程序结束后由操作系统释放。

程序运行后:

 栈区:
注意事项:不要返回局部变量的地址,因为栈区开辟的空间由编译器自动释放。

下面代码中函数func()中的a是局部变量,返回局部变量的地址,他保留一次,然后局部变量就会自动被编译器释放,所以第二次打印输出乱码。

#include 
#include 
using namespace std;
int*  func()
{
	int a = 10;
	return &a;
}
int main()
{
	int *p = func();
	cout << *p << endl;//10
	cout << *p << endl;//乱码2034538888
	return 0;
}

堆区:
​​​​​​​由程序员分配和释放,若结束时未释放则由系统释放。
通常使用new开辟堆内存空间。
在使用new开辟空间后一定要使用delete释放,释放数组时则需注明[],如delete [] p;

见六、new操作符

#include 
#include 
using namespace std;
//在堆区开辟数据
int*  func()
{
	//利用new关键字将数据开辟到堆区
	//new 返回的是该数据类型的指针,所以需要指针去接收
	//指针本质也是局部变量,放在栈区,但指针保存对应的数据堆区中的地址。
	int* p = new int(10);
	return  p;
}
int main()
{
	int *p = func();
	cout << *p << endl;//10
	cout << *p << endl;//10
    delete p;
	//cout << *p << endl;//10  //会报错,因为delete释放了指针p指向的堆区中的数据空间
	return 0;
}



 

(根据B站黑马程序员C++课程进行学习记录)

你可能感兴趣的:(c++)