这篇文章主要介绍了C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
内存分区模型
1 代码区
2 全局区
// 全局变量、静态变量、常量
#includeusing namespace std; // 全局变量、静态变量、常量 //全局变量 int g_a=10; int g_b=10; //const修饰的全局常量 const int c_g_a = 10; const int c_g_b = 10; int main() { //创建普通局部变量 int a = 10; int b = 10; cout << "局部变量a的地址为:" << (int)&a << endl;//&a取地址,(int)强制转换为10进制 cout << "局部变量b的地址为:" << (int)&b <
总结
3 栈区
栈区注意事项
- 不要返回局部变量的地址
- 栈区的数据由编译器管理开辟和释放
#includeusing namespace std; //栈区注意事项 //不要返回局部变量的地址 //栈区的数据由编译器管理开辟和释放 int *func(int b)//形参数据也存放在栈区 { b = 100; int a = 10;//局部变量:存放在栈区,栈区的数据在函数执行完毕自动释放 return &a;//返回局部变量的地址 } int main() { //接受func函数的返回值 int *p=func(1); cout << *p << endl;//第一次可以打印正确的数字,因为编译做了一次保留 cout << *p << endl;//第二次,就没了,输出乱码 system("pause"); return 0; }
4 堆区
#includeusing namespace std; int *func() { //利用new关键字,将数据开辟到堆区 //指针本质也是局部变量,存放在栈上,指针保存的数据存放咋堆区 int* p = new int(10); return p; } int main() { //在堆区开辟数据 int* q = func(); cout << *q << endl;//与上一个程序对比,多输出几次 cout << *q << endl; cout << *q << endl; cout << *q << endl; system("pause"); return 0; }
5 new运算符
#includeusing namespace std; //1.new的基本语法 int* func() { //在堆区创建整形数据 //new返回的是数据类型指针 int* p = new int(10); return p; } //2.在堆区利用new 开辟数组 int main() { //在堆区开辟数据 int* q = func(); cout << *q << endl;//与上一个程序对比,多输出几次 cout << *q << endl; cout << *q << endl; //堆区数据是由程序员管理开辟、管理释放 //如果想释放堆区数据,利用关键字delete delete q; cout << *q << endl;//内存已被释放,再次访问就是非法操作,报错 system("pause"); return 0; }
#includeusing namespace std; //1.new的基本语法 //2.在堆区利用new 开辟数组 void test() { //创建10整形数据的数组,在堆区 int *arr =new int[10];//10代表数组有10个元素 for (int i = 0; i <10; i++) { arr[i] = i + 100;//给10个元素赋值,100~109 } for (int i = 0; i <10; i++) cout << arr[i] << endl; //释放堆取数组 //释放数组的时候,要加[]才可以,否则认为是只是放一个元素 delete[] arr; } int main() { test(); system("pause"); return 0; }
注意:
- 释放堆取数组
- 释放数组的时候,要加[]才可以,否则认为是只是放一个元素
参考:
以上就是C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new)的详细内容,更多请关注0133技术站其它相关文章!