C/C++之内存管理

article/2025/6/26 6:54:00

1. 内存分布

我们定义的变量对于电脑来说也叫数据,同时电脑也会把这些数据分为不同的类型,分别是局部数据静态数据全局数据常量数据动态申请数据

在 C++ 中,各类数据存储位置如下:

• 局部数据:存于栈区,由编译器自动分配和释放,函数结束后数据销毁。

• 静态数据(static 修饰的局部变量):存于静态存储区(全局区),程序启动时分配,结束时释放,生命周期贯穿程序运行。

• 全局数据:存于静态存储区(全局区),作用域为整个程序,程序运行期间一直存在。其中未初始化的全局变量存于BSS段,已初始化的存于数据段。

• 常量数据:存于常量区(只读数据段),不可修改,程序结束后释放。

• 动态申请数据(new/malloc分配):存于堆区,需手动释放(delete/free),生命周期由程序员控制。

在上面这张图片中,各个变量可以分为以下这些类型:

• 局部数据:localVar 、num1 、char2  、pChar3  、ptr1 、ptr2 、ptr3  ,它们在函数 Test 内部定义,作用域局限于函数内,存储在栈区,函数执行完内存自动释放。

• 静态数据:函数内 staticVar  ,以及函数外 staticGlobalVar  。staticVar 虽在函数内定义,但因 static 修饰存储在静态存储区(全局区),生命周期贯穿程序始终;staticGlobalVar 是全局静态变量,也存于静态存储区(全局区)

• 全局数据:globalVar  ,在函数外部定义,作用域为整个程序,存于静态存储区(全局区)

• 常量数据:pChar3 指向的字符串 "abcd"  ,字符串常量存于常量区(只读数据段),内容不可修改。

• 动态申请数据:ptr1 、ptr2 、ptr3  指向的内存空间 ,分别通过 malloc 、calloc 、realloc 函数在堆区动态分配内存,需手动调用 free 释放。

2. C语言中动态内存管理方式:malloc/calloc/realloc/free

• malloc:从堆上分配指定字节数的连续内存空间,不对内存进行初始化 ,分配的内存中可能是垃圾值。例如 int *p = (int*)malloc(10 * sizeof(int)); 是分配能存放10个 int 类型数据的空间。

• calloc:在堆上分配指定数量、指定大小的内存空间,并且会将分配的内存空间全部初始化为0。如 int *q = (int*)calloc(5, sizeof(int)); 是分配5个 int 类型数据的空间并清零。

• realloc:用于调整已分配内存块的大小。可以扩大或缩小之前由 malloc、calloc 或 realloc 分配的内存块。若扩大内存,原内存内容会复制到新区域,新扩展部分值不确定;若缩小内存,原内存超出新大小部分会被截断。例如 int *r = (int*)realloc(p, 20 * sizeof(int)); 尝试将 p 指向的内存块大小调整为能存放20个 int 类型数据 。
简单来说就是malloc和calloc都是开辟空间用的,区别是malloc不初始化,calloc初始化为0。

cealloc用于调整已经分配好的大小。

PS:虽然calloc会初始化,但是我们在使用的时候跟多的会使用malloc,因为比较方便。

free的话就是释放开辟的内存。

我们知道程序结束的时候使用未释放的内存会自动释放,那么我们为什么还要自己通过free来进行释放呢?这是因为很多大型的程序是长期开着的,所以如果我们每个进程都有一小段内存不释放的话,那整个程序就会越来越卡,所以说我们在一开始就要养成自己free的好习惯,当然后期我们会接触到一个叫智能指针的东西,通过编译器自己调用来释放资源。

3. c++内存管理方式:new/delete

C++通过newdelete操作符进行动态内存管理。

我们知道C++这门语言底层是通过C语言来进行的。所以我们的new和delete的底层实现也是malloc和free。

我们来看下面这个代码,这是使用new和delete的格式。

#include <iostream>
using namespace std;class A {...
};class B {...
};int main() {// 使用 new 创建单个对象A* ptrA = new A();  B* ptrB = new B();  // 使用 delete 释放单个对象delete ptrA;  delete ptrB;  // 使用 new 创建数组对象A* arrA = new A[3];  B* arrB = new B[2];  // 使用 delete[] 释放数组对象(注意 [])delete[] arrA;  delete[] arrB;  return 0;
}

PS1:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。

PS2:new如果失败的话编译器会抛异常的,所以我们也需要接收异常。

我个人认为new和delete的出现是为了类,因为我们如果使用malloc和free来对类进行创建和销毁的话,会比较麻烦。

4. C++与C语言内存管理之间的差异

共同点:就是都是从堆上开辟空间并且都需要手动释放内存。

不同点:1. 就是C语言那套叫函数,而C++那套叫操作符(即operator new和operator delete)。

               2.  C语言那套要自己手动计算空间,C++那套不需要(如果是数组的话就只需要加个数)。

               3.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。

               4.C语言那套申请空间失败时,返回的是NULL,因此使用时必须判空,C++那套不需要,但要捕获异常。

                5. malloc申请的空间不会初始化,new可以初始化。

                6. new后面跟的是类型,所以不用强转。 C语言那套在void* 的情况下需要强转。

5. 内存泄露

内存泄露分为两种,一种是堆内存泄漏,一种是系统资源泄漏

堆内存泄漏(Heap leak)

堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak

系统资源泄漏

指程序使用系统分配的资源,如套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

内存泄露这个问题是非常麻烦的,所以我们在平常写代码的时候是一定要注意的,严重是可以造成巨大损失的,如服务器崩溃之类的。

PS:其实如果是一次泄露很多是比较好发现的,就怕一次泄露一点点。因为这一点点实在是太小了,非常难发现,但是系统运行时间长了就一定会出问题。


http://www.hkcw.cn/article/uGkgLMmsgF.shtml

相关文章

C++从入门到实战(十一)详细讲解C/C++语言中内存分布与C与C++内存管理对比

C从入门到实战&#xff08;十一&#xff09;详细讲解C/C语言中内存分布与C与C内存管理对比 前言一、C/C语言中内存分布1.内核空间2.栈3.堆4.数据段5.代码段 二、例题带练巩固C/C语言中内存分布的知识题目讲解题目答案 三、C语言动态内存分配&#xff08;知识回顾&#xff09;3.…

Educational Codeforces Round 175 (C.二分 D.树形结构、dp)

文章目录 2025.3.3C. Limited Repainting(二分)题意思路代码 D. Tree Jumps(树形结构、dp)题意思路代码 2025.3.3 Educational Codeforces Round 175 (Rated for Div. 2) C. Limited Repainting(二分) 题意 给出一个字符串a由“R”B“组成&#xff0c;不同位置对应一个惩罚…

老太突然倒地吓坏路人民警紧急相救 家属感激救命之恩

“谢谢你们帮我父亲‘捡’回一条命,再晚一会儿后果不堪设想!”5月21日,市民刘女士接到民警电话时再次表达了对紧急救援的感激之情。她的父亲76岁,患有阿尔兹海默病,下午扛着锄头出门后一直未归,家人找了3个多小时都没找到。5月19日傍晚6时许,大冶市公安局还地桥派出所接…

53岁男子诱骗侵害幼女被判刑 深挖彻查揭露更多罪行

5月29日,江苏省人民检察院召开新闻发布会,介绍了近年来加强未成年人网络司法保护的工作情况及典型案例。如皋市检察院副检察长卢海琴介绍了一起典型案例,通过深挖彻查,案件从1名被告人追到3名被告人、从1个罪名查到5个罪名、从1起强奸事实挖到19起犯罪事实、从1名被害人增加…

谷歌DeepMind最强手语翻译模型登场 打破沟通障碍

谷歌DeepMind团队于5月27日宣布推出SignGemma,这是其迄今为止最强大的手语翻译模型,能够将手语转化为口语文本。该开源模型计划在今年晚些时候加入Gemma模型家族。SignGemma支持多语言功能,但目前主要针对美国手语(ASL)和英语进行了深度优化,开发者可以自由使用并改进它。…

【C++】STL详解-----(二)vetor的使用

文章目录 vector的介绍vector的使用&#xff1a;元素访问empty vector的增删查改push_back和pop_backinsert和erase vector迭代器失效问题迭代器失效解决方法 vector的介绍 vector是可变大小数组的容器vector采用连续空间存储的方式&#xff0c;同时也表示可以采用下标访问vec…

string类

1. 为什么学习string类&#xff1f; string叫串&#xff0c;它是一个管理字符串的类&#xff0c;现实中为什么要出一个管理字符串的类呢&#xff1f;现实中我们有很多类型&#xff0c;比如int、double、char等&#xff0c;但发现这个世界的一些复杂东西都是通过字符串表示的…

潍坊烟花秀压轴项目缺席遭吐槽 设备故障引争议

多名网友在社交平台发帖表示,5月30日晚他们参加了潍坊世界风筝乐园的烟花秀表演,单人票198元,双人票298元。然而,之前宣传的压轴项目“七彩祥云”并未出现,引发观众不满。潍坊世界风筝乐园工作人员解释称,由于设备故障,“七彩祥云”环节被迫取消,并且当晚和接下来两天的…

江苏城市足球联赛为何这么火 赛事带动文旅热潮

最近,2025年江苏省城市足球联赛“苏超”火了。从“比赛第一,友谊第十四”到各地纷纷推出“跟着赛事游江苏”的文旅优惠,以足球为媒,以赛事为桥,江苏展现了独特的魅力。自5月10日揭幕以来,“苏超”迅速走红,成为江苏省乃至全国关注的热点。你以为“苏超”只是踢踢比赛?殊…

汪涵体验问界M9五座零重力座椅 舒适到不想起

汪涵体验了问界M9的零重力座椅,表情十分享受。这款座椅采用零压感知人体工学专利设计,腰部零压角为121,腿部零压角为136,能够使全身压力均匀分布,带来零压悬浮感。汪涵坐在上面久久不愿起身,甚至在车展主持时也选择躺着进行,这种舒适度让人非常心动。责任编辑:0882

德国为何要解除对援乌武器射程限制 西方军援策略重大转变

2025年5月28日,德国新当选总理弗里德里希默茨在柏林宣布,乌克兰的西方盟友将取消向基辅供应武器的射程限制。这一政策调整涵盖美国、英国、法国和德国等主要援乌国家,标志着西方对乌军援策略的重大转变,随即引发国际社会对俄乌冲突走向的强烈关注。在WDR组织的论坛上,默茨…

Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)

文章目录 1. Nginx目录结构分析1.1 conf目录1.2 html目录1.3 logs目录1.4 sbin目录 2. Nginx的启用方式和停止方式2.1 信号控制2.1.1 信号2.1.2 调用命令 2.2 命令行控制2.2.1 基础操作类2.2.2 配置测试类2.2.3 进程控制类2.2.4 路径与文件类2.2.5 高级配置类 3. Nginx配置文件…

印军高层被追问是否与巴方会面 印空军将领打马虎眼

印巴停火协议签署后,两国都在宣称自己取得了胜利。然而,印度军方的表现却让人失望。5月11日,印度空军中将巴蒂召开记者会,面对记者们的追问,他声称印度空军在这次冲突中表现出色,并坚称打下了好几架巴基斯坦飞机。但当被问及具体数字时,他却表示“不想冒险猜测”,并解释…

大V:辽宁舰率海军最强编队驶入西太 展现惊人实力

自去年10月在南海与山东舰稍微展示了一下双航母的实力后,辽宁舰到今年5月中旬都没有什么动作,大家的目光都放在了更出色的山东舰和福建舰上。然而,辽宁舰在5月下旬南下西太平洋,展示了强大的实力。护航编队包括两艘055型驱逐舰、五艘052D型驱逐舰和三艘054A型护卫舰,再加上…

印度刚喊话巴基斯坦,转头联合蒙古军演?背后算盘藏不住了!

印度最近的一系列举动引起了广泛关注。不久前,印度还在与巴基斯坦紧张对峙,并放狠话威胁对方,紧接着又派了一个大型商业代表团访问台湾。更令人意外的是,印度现在绕过中国,直接与蒙古国进行联合军事演习。这种行为就像是小孩子打架,正面打不过就绕到背后捅手指头。然而,…

25艘龙船巡游广州荔湾湖 展现广府龙舟文化魅力

5月31日,第十五届“荔枝湾新西关”民俗文化活动“五月五龙船鼓”在广州荔湾湖公园盛大开幕。上午8时30分,十多艘来自南海盐步、坑口、茶滘等地的龙船装饰一新,从珠江口岸徐徐进入荔湾湖面,与泮塘村的龙船一同趁景。泮塘村的龙船作为东道主,率先引领着各兄弟村的龙船队伍绕…

河南鹤壁一水库水位下降现千佛石窟 千年佛像重见天日

近日,有网友发布视频显示,河南省鹤壁市淇县夺丰水库水位下降后,露出一处石洞。这处石洞虽然洞口不大,但内部却别有洞天,四周布满佛像,造型精细,栩栩如生。洞内还有较深的积水。不少网友称这个洞为千佛洞,并有人前来打卡。该石窟名为前嘴石窟,开凿于东魏时期,千百年来…

全世界都在划龙舟过端午 全球共庆文化盛宴

当农历五月的暖风拂过东亚的稻田,粽叶的清香飘荡在东南亚的街巷,龙舟的鼓点响彻欧美的河流,全世界共同庆祝源自中国的古老节日——端午节。这个绵延两千多年的传统节日,早已超越地域界限,成为人类共享的文化盛宴。在中国,从江南水乡到北国平原,家家户户清晨便飘起蒸煮粽…

美禁运C919发动机 破局之道在哪里 核心技术自主可控

没有发动机,中国的大飞机还能飞吗?当美国突然暂停向中国商飞出售航空发动机技术时,这个问题迅速引起广泛关注。西方媒体纷纷唱衰“C919即将搁浅”,而中国外交部则强硬回击,坚决反对这种恶意封锁。这场看似突如其来的问题,实际上揭示了中美科技竞争的深层次矛盾——中国航…

python调用C++ DLL

使用C创建动态链接库&#xff1a; dllmain.cpp #include <windows.h> #include <string> #include <vector> #include "opencv2/opencv.hpp"BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {return TRUE…