02 程序运行后
-
栈区:
由编译器自动分配、释放。用于存放函数的参数值、局部变量、形参数据等。
注意:不要返回局部变量的地址,因为栈区开辟的数据由编译器自动释放。
#include
using namespace std; //栈区数据的注意事项 //栈区数据由编译器管理 //注意:不要返回局部变量的地址。 int* fun1() { int a = 10; //局部变量,数据存放在栈区,函数执行完成后自动释放 cout << a << endl; cout << (int)&a << endl; return &a; } void main() { int* p = fun1(); cout << *p << endl; //第一次是编译器做了保留 cout << *p << endl; cout << (int)p << endl; } 运行结果:
10 1593309652 10 107 1593309652
- 总结:函数里面不要返回局部变量的地址。
-
堆区:
由开发分配和释放,若开发不释放,这在程序结束的时候由操作系统回收。
说明:在开发中,可以在堆区存放数据。这个数据的存储内存不会被编译器删除,需要开发手动删除。若一直不删除,在程序运行结束后,操作系统将自行回收这部分内存。
在 c++中,如果想在堆区开辟内存,需要使用
new
来开辟空间。#include
using namespace std; //在堆区开辟数据 int* func1() { //利用 new 关键字创建堆区数据 // 这个指针本质还是栈区数据(局部变量)。但是指针保存的地址是存放在堆区的。 int *p = new int(10); return p; } int main() { int* p = func1(); cout << *p << endl; cout << *p << endl; cout << *p << endl; system("pause"); return 0; } 运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
10 10 10
注意:关键字
new
返回的是一个地址。比如int *p = new int(10);
,返回到*p
的是一个内存地址。而return p;
返回的就是存放了数据10
的地址。因为这一块地址不会被删除,所以会一直留着。在离开函数之后,再去访问这一块数据,数据依然存在。new
的具体内容参加下一部分。
- 总结:堆区的数据由开发管理开辟与释放。可以使用关键字
new
开辟堆区数据。
:-)