C++基础知识学习笔记(3)

资料来源

https://www.bilibili.com/video/BV1et411b73Z?p=84&vd_source=cc561849591f6a210152150b2493f6f3

核心内容

程序的内存模型

image

代码区

image

全局区

在函数外面声明了全局变量,在main函数里面创建了局部变量,打印了其地址:

image

image

image

静态变量:在普通变量前面加一个static,属于静态变量。静态变量也属于全局变量。

image

全局区域内有:全局变量、静态变量、常量。
常量有:字符串常量、const修饰的全局变量(全局常量)、const修饰局部变量(局部常量,不放在全局区)。

image

image

栈区

栈区:

  • 由编译器自动分配,存放函数的参数值,局部变量等。
  • 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
  • 局部变量、形参等数据会放在栈区。
int* run() {
	int a = 1;
	return &a;
}
int main()
{
	int* a =  run();
	cout << *a << endl;
	cout << *a << endl;
	return 0;
}

image

第一次能打印,是编译器做了保留;第二次就不保留了。

堆区

堆区:

  • 由程序员分配释放,若程序员不释放,则程序结束时由操作系统回收。
  • C++中主要用于new来开辟内存。
int* run() {
	//用new将数据开辟到堆区
	int a = 1;
	//指针变量p放在栈区,但是其指向的数据在堆区
	int* p = new int(10);
	return p;
}
int main()
{
	int* a =  run();
	cout << *a << endl;
	cout << *a << endl;
	return 0;
}

image

new运算符

  • new在堆区开辟数据
  • 开辟的数据需要由程序员手动释放,释放用delete
  • new返回的是开辟的数据在堆区的地址
int main()
{
	int* arr = new int[10];
	for (int i = 0; i < 10; i++) {
		arr[i] = i + 101;
	}
	for (int i = 0; i < 10; i++) {
		cout << arr[i] << endl;
	}
	//释放堆区的数组
	delete[] arr;//必须加[],否则只会释放一个数据

	return 0;
}

发现不加[]时,剩下9个数组元素的值虽然能访问,但是其值变了:
image

posted @ 2024-05-25 13:38  greencode  阅读(4)  评论(0编辑  收藏  举报