C++之内存分区

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;
}
相关推荐
Vect__13 分钟前
从底层到上层的“外挂”:deque、stack、queue、priority_queue 全面拆解
数据结构·c++
草莓熊Lotso15 分钟前
C++ 手写 List 容器实战:从双向链表原理到完整功能落地,附源码与测试验证
开发语言·c++·链表·list
无限进步_17 分钟前
【C语言】杨辉三角:数学之美与编程实现的完美结合
c语言·开发语言
wxin_VXbishe19 分钟前
基于SpringBoot的天天商城管理系统的设计与现-计算机毕业设计源码79506
java·c++·spring boot·python·spring·django·php
初圣魔门首席弟子27 分钟前
const string getWord() ;和 string getWord() const ;是一样的效果吗
开发语言·c++
明天会有多晴朗1 小时前
C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
c语言·开发语言·算法
泽虞1 小时前
《Qt应用开发》笔记p3
linux·开发语言·数据库·c++·笔记·qt·面试
ajassi20001 小时前
开源 C++ QT QML 开发(十八)多媒体--音频播放
c++·qt·开源
BS_Li1 小时前
C++11(可变参数模板、新的类功能和STL中的一些变化)
c++·c++11·可变参数模板
奶茶树1 小时前
【C++】12.多态(超详解)
开发语言·c++