第八十五天学习记录:C++核心:内存分区模型

这篇具有很好参考价值的文章主要介绍了第八十五天学习记录:C++核心:内存分区模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内存分区模型

C++程序在执行时,将内存大方向划分为4个区域
1、代码区:存放函数体的二进制代码,由操作系统进行管理
2、全局区:存放全局变量和静态变量以及常量
3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
4、堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区的意义:

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

1、程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此
全局区还包含了常量区,字符串常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放

#include <iostream>
using namespace std;

//全局变量
int g_a = 10;
int g_b = 10;

int main()
{
	//创建普通局部变量
	int a = 10;
	int b = 10;

	cout << "局部变量a的地址为:" << &a << endl;
	cout << "局部变量b的地址为:" << &b << endl;

	cout << "全局变量a的地址为:" << &g_a << endl;
	cout << "全局变量b的地址为:" << &g_b << endl;

	return 0;
}

第八十五天学习记录:C++核心:内存分区模型,编程语言学习,c++,学习

#include <iostream>
using 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的地址为:" << &a << endl;
	cout << "局部变量b的地址为:" << &b << endl;

	cout << "全局变量a的地址为:" << &g_a << endl;
	cout << "全局变量b的地址为:" << &g_b << endl;

	//静态变量 在静态变量前面加static,属于静态变量

	static int s_a = 10;
	static int s_b = 10;

	cout << "静态变量a的地址为:" << &s_a << endl;
	cout << "静态变量b的地址为:" << &s_b << endl;

	//常量
	//字符串常量

	cout << "字符串常量的地址为:" << &"hello world" << endl;

	//const修饰的变量
	//const修饰的全局变量,const修饰的局部变量

	cout << "全局常量a的地址为:" << &c_g_a << endl;
	cout << "全局常量a的地址为:" << &c_g_b << endl;

	const int c_l_a = 10;
	const int c_l_b = 10;

	cout << "局部常量a的地址为:" << &c_l_a << endl;
	cout << "局部常量a的地址为:" << &c_l_b << endl;

	return 0;
}

第八十五天学习记录:C++核心:内存分区模型,编程语言学习,c++,学习

2、程序运行后

栈区:

由编译器自动分配释放,存放函数的参数值,局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
反面案例:

#include <iostream>
using namespace std;

int * func()
{
	int a = 10;
	return &a;
}

int main()
{
	int* p = func();
	cout << *p << endl;//第一次可以打印正确的数字是因为编译器做了保留
	cout << *p << endl;//第二次这个数据就不再保留的
	return 0;
}

第八十五天学习记录:C++核心:内存分区模型,编程语言学习,c++,学习

堆区

在C++中主要利用new在堆区开辟内存

#include <iostream>
using namespace std;

int * func()
{
	//利用new关键字  可以将数据开辟到堆区
	//指针 本质也是局部变量,放在栈上,指针保存的数据是放在堆区
	int* p = new int(10);
	return p;
}

int main()
{
	int* p = func();
	cout << *p << endl;
	cout << *p << endl;
	delete p;
	p = nullptr;
	return 0;
}

3、new操作符

c++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete

问:C语言中free指针后,指针地址不会变,c++中delete指针后,指针的地址也会改变?
答:在C语言中,调用函数free会释放指针指向的内存,并将内存返回给系统,但指针本身的值不会受到影响,仍然指向之前分配的内存地址。这是因为C语言中的指针只是一个整数变量,它存储的是地址(整数),而不是实际的对象。
而在C++中,delete运算符执行的操作与free函数类似,它会释放指针所指向的内存并将其返回给系统。不同的是,delete还会调用被删除对象的析构函数。此外,当使用delete删除堆上分配的内存后,指向该内存的指针将变为无效指针,指向的内存已经被释放,所以在C++中,删除指针后,指针的值会变成无定义的。不过,可以使用nullptr或0来表示空指针。

语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针。

#include <iostream>
using namespace std;

//1、new的基本语法
int * func()
{
	//在堆区创建整型数据
	//new返回是该数据类型的指针
	int* p = new int(10);
	return p;
}

void test01()
{
	int * p = func();
	cout << *p << endl;
	//堆区的数据由程序员管理开辟,程序员管理释放
	//如果想释放堆区的数据,利用关键字delete
	delete p;
	//cout << *p << endl;//内存已经被释放,再次访问就是非法操作,会报错
}

//2、在堆区利用new开辟数组
void test02()
{
	//创建10个整型数据的数组在堆区
	int * arr = new int[10];//10代表数组有10个元素
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << *(arr + i) << endl;
	}
	//释放堆区数组
	//释放数组的时候 要加[]才可以
	delete[] arr;
}

int main()
{
	test01();
	test02();
	return 0;
}

补充:
问:new int[10]后,delete[]为什么可以不在[]加10?
答:
在使用 new 运算符为动态分配内存时,会在堆上额外分配一些元数据来跟踪分配的内存区域的大小。在释放内存时,delete[] 运算符会使用这些元数据来确定应该回收的内存数量,因此你不需要指定数组的大小。

这意味着,如果你使用 new int[10] 分配了一个包含 10 个元素的整数数组,那么在释放数组时,你只需要使用 delete[] 运算符,而不必指定数组大小。

如果你指定了错误的大小,那么会发生未定义的行为。有时候这种错误可能不会导致问题,但有时候会导致程序崩溃或数据损坏。如果你不确定应该使用哪个运算符,最好查阅相关文档或咨询更有经验的开发人员。

问:malloc,free和new,delete的区别。
mallocfree 是在 C 语言中使用的动态内存分配和释放函数,newdelete 是在 C++ 语言中使用的动态内存分配和释放运算符。它们之间的主要区别如下:

  1. mallocfree 是函数,而 newdelete 是运算符。这意味着 newdelete 可以像其他运算符一样重载,而 mallocfree 不能。

  2. newdelete 是 C++ 的内存管理方式,它们可以用于动态分配对象,而 mallocfree 只是简单地分配和释放内存,不能够调用对象的构造函数和析构函数。

  3. newdelete 是类型安全的,它们知道要分配的内存大小,而 mallocfree 可以分配任意大小的内存块。

  4. newdelete 可以跟踪对象的数量和大小,也可以自动调用构造函数和析构函数,而 mallocfree 不能跟踪对象的数量和大小,也不能自动调用构造函数和析构函数。

总之,newdelete 操作符是建议在 C++ 中使用的内存分配和释放方式,它们更加高效、类型安全,并且能够跟踪对象的数量和大小。而 mallocfree 虽然可以在 C++ 中使用,但还是更多的使用在 C 语言和一些使用标准库的编程语言中。文章来源地址https://www.toymoban.com/news/detail-519944.html

到了这里,关于第八十五天学习记录:C++核心:内存分区模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第一百一十五天学习记录:C++提高:STL初识(黑马教学视频)

    1、长久以来,软件界一直希望建立一种可重复利用的东西 2、C++的面向对象和泛型编程思想,目的就是重复性的提升 3、大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 4、为了建立数据结构和算法的一套标准,诞生了STL 1、STL,标准模板库 2、

    2024年02月16日
    浏览(44)
  • 第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

    功能描述: 向deque容器中插入和删除数据 函数原型: 两端插入操作: 指定位置操作: 这里有个坑需要避一下,就是当重复执行d1.erase(it);后程序运行会崩溃。 崩溃的原因是在执行d1.erase(it)之后,迭代器it失效了,不能再继续使用。在C++的STL中,当执行erase操作后,如果要继续

    2024年02月13日
    浏览(44)
  • C++内存分区模型

    在执行C++程序的过程中,内存大致分为四个区域: 栈区(Stack) :用于实现函数调用。由编译器自动分配释放,存放函数的参数值和局部变量等 堆区(Heap) :用于存放动态分配的变量。由程序员动态分配和释放,使用new和delete操作符 全局/静态存储区(Data Segment BSS Segment) :存放全

    2024年02月16日
    浏览(44)
  • C++基础——内存分区模型

    C++程序在执行是,将内存大致分为4个区域: 代码区:用于存放二进制代码,由操作系统进行管理 全局区:存放全局变量和静态变量及常量 栈区:由编译器自动分配释放,存放函数的参数、局部变量等 堆区:程序员分配,如果程序员不释放,程序结束后由操作系统回收 内存

    2024年02月07日
    浏览(37)
  • c++内存的四大分区详解

    目录 前言: 1、程序的基本运行流程 2,为啥要分为四个区域? 3,分为哪四个区域? 4,4个区域详解 代码区: 为什么会设置这两个功能呢? 全局区: 栈区: 堆区:  new: 补充知识:new 总结: 这篇博客介绍 c++四大分区 的详解,其中也会涉及到有关 new 的知识

    2024年02月20日
    浏览(37)
  • 第六十五天学习记录:高等数学:函数与极限(宋浩板书)

    C语言学习后,曾为先学C++还是数据结构纠结了半天。在看数据结构前言的时候,发现学习数据结构之前还需要一定的数学基础。虽然涉及到的数学基础不多,但想到以前大学高数,现代不是60分万岁就是不到80分,好像就概率论稍微了解得多一些,因为那个时候玩游戏会用到

    2024年02月08日
    浏览(37)
  • Day 9 C++ 内存分区模型

    目录 内存四区 代码区 全局区 栈区 堆区 内存四区意义: 程序运行前后内存变化 程序运行前 代码区 全局区  程序运行后 栈区 堆区 new操作符 基本语法 创建 释放(delete) 代码区 代码区 (Code Segment):存放程序的机器指令,包括函数体的二进制代码。这部分内存由操作系统

    2024年02月15日
    浏览(71)
  • 第八十一回:如何在IOS上使用三方包

    我们在前面章回中介绍了Flutter中如何使用三方包相关的内容,本章回中将介绍 如何在IOS上使用三方包 .闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的内容主要是指在Flutter中引入三方包后在IOS系统中编译并且运行。在前面章回中介绍了如何使用三方包相关的内容

    2024年02月16日
    浏览(40)
  • C++面向对象丨1. 内存分区模型

    Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDN@AXYZdong,CSDN首发,AXYZdong原创 唯一博客更新的地址为: 👉 AXYZdong的博客 👈 B站主页为: AXYZdong的个人主页 系列文章目录 C++基础入门

    2023年04月18日
    浏览(36)
  • C++系列第八篇 数据类型下篇 - 复合类型(指针及动态内存申请)

    C++ 系列 前篇 为什么学习C++ 及学习计划-CSDN博客 C++ 系列 第一篇 开发环境搭建(WSL 方向)-CSDN博客 C++ 系列 第二篇 你真的了解C++吗?本篇带你走进C++的世界-CSDN博客 C++ 系列 第三篇 C++程序的基本结构-CSDN博客 C++ 系列 第四篇 C++ 数据类型上篇—基本类型-CSDN博客 C++ 系列 第五

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包