c++程序的内存模型,new操作符详解

发布时间:2024年01月21日

目录

内存四区

程序运行前

代码区

全局区

程序运行后

栈区

堆区

new操作符?

创建一个数?

创建一个数组


内存四区

不同区域存放不同的数据,赋予不同的生命周期,让我们更加灵活的编程

程序运行前

程序运行前就有代码区和全局区

代码区

程序编译后会生成exe可执行程序

代码区存放的是cpu执行的机器指令,二进制01

有两个特点

共享性:

对于频繁执行的代码,程序中只需要有一份

只读性:

不可以被修改,防止程序意外

全局区

存放全局变量与静态变量,常量

可以在编译器内尝试输出它们的地址,全局区的地址会挨在一起,而非全局区的变量又会存在另一块地址处

程序运行后

栈区

栈区内存由编译器自动分配释放?

不要返回局部变量的地址,因为局部变量存在栈区,当函数执行完后,栈区的内存会被自动释放

编译器会为我们做一次保留,第二次就不会保留了,而是给我们一段乱码

堆区

由程序员进行分配和释放,如果程序员没释放,程序结束时也会由操作系统回收

使用new关键字,可以将数据开辟到堆区

int *p = new int(10)

示例:开辟内存并且将内存的地址给指针p ,那个地址处存的值为10

指针p还是在栈空间里面,保存的是地址

new操作符?

创建一个数?
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int *p = new int(10);
	cout << *p << endl;
	delete p;
	cout << *p;
	return 0;
}

?

第二次会输出乱码

创建一个数组
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int * arr = new int[10];
	//在堆区创立一个含10个元素的数组,arr为该数组的首地址
	for(int i = 0; i < 10; i++){
		arr[i] = i;
	}
	for(int i = 0; i < 10; i++) cout << arr[i] << endl;
	return 0;
}

?

delete[] arr;
	//释放堆区数组

?

文章来源:https://blog.csdn.net/2301_79431343/article/details/135731038
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。