C++程序在执行时,将内存大方向划分为4个区域
1.代码区 :存放函数体的二进制代码,由操作系统进行管理;
2.全局区 :存放全局变量和静态变量以及常量;
3.栈区 :由编译器自动分配释放, 存放函数的参数值,局部变量等;
4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
C++中主要利用new在堆区开辟内存,堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete。
利用new创建的数据,会返回该数据对应的类型的指针
例如:
javascript
int* func()//返回int指针的函数
{
int* a = new int(10);
return a;
}
int main() {
int *p = func();
cout << *p << endl;
//利用delete释放堆区数据
delete p;//要记得释放!!
//cout << *p << endl; //报错,释放的空间不可访问
system("pause");
return 0;
}
new的释放:
javascript
delete p;//p不是数组变量
delete[] p;//p是数组
栈区的数据由编译器释放,因此函数中的局部变量不能作为地址或者引用返回
javascript
//错误示范1:
int * func()
{
int a = 10;
//若是用static把局部变量变为静态变量,则可以用
//static int a =10;
return &a;
}
int main() {
int *p = func();
cout << *p << endl;
system("pause");
return 0;
}
//错误示范2:
/返回局部变量引用
int& test01() {
int a = 10; //局部变量
//若是用static把局部变量变为静态变量,则可以用
//static int a =10;
return a;
}
int main()
{
//不能返回局部变量的引用
int& ref = test01();
cout << "ref = " << ref << endl;
}
正确使用函数中局部变量作为值返回
例如:
javascript
#include <iostream>
using namespace std;
int test01() {
int a = 10; //局部变量
return a;
}
int main() {
int ref = test01();
cout << "ref = " << ref << endl;
}