“佛祖”都爆砍40+了,你还不会C++内存管理吗?

本文深入探讨了C++中的内存管理,对比了new/delete与malloc/free在处理内置类型和自定义类型时的区别,包括异常处理机制。同时,解释了内存泄漏的概念及其可能情况,强调了正确释放内存的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

今日喜讯

前言

一,回忆C/C++内存分布

二,C语言动态内存管理

三,C++动态内存管理

3.1new/delete 和 mallc/free 的区别

对于内置类型的区别

对于自定义类型的区别

异常处理机制不同

3.2底层调用

四,内存泄露

4.1什么是内存泄露?

4.2内存泄漏的几种情况


今日喜讯

欢迎各位大佬们来到库森的博客,首先是我们的今日喜讯环节!!哦吼吼吼!!!

今天是2022年4月11日。今天看到常规赛最后一场的勇士,我想说,佛祖,我跪了!我承认我之前你的声音大了!

前言

好的,接下来我们进入正文。今天库森为大家带来的是有关C++内存管理的内容。之前在C语言中我们了解过有关C语言的内存管理,那么在C语言中,对于内存管理,我们有开辟空间的malloc类的函数,以及释放函数 free。那么在C++的内存管理又有什么区别呢?接下来我们一起看看吧!

一,回忆C/C++内存分布

那么首先我们依旧还是需要将C/C++内存分布做一下回忆。

在系统中,C/C++程序的内存区域一般会有如下几个方面,栈,堆,数据段(全局变量,静态变量),代码段(只读常量,执行代码等),如下图所示:

首先,在栈中存放的一般是一些局部变量以及临时变量,比如一些函数名,指针这些。

其次,对于堆内存来说,就是可以动态分配给我们程序员使用的一个大小为 2G 的内存区域。在C语言中,我们可以通过malloc以及类似的函数去申请空间,当然在不使用了之后,我们需要将其释放。

然后,对于数据段,或者我们可以将其称为静态区, 在这里会存放一些全局的变量,一些静态变量等,因为我们不希望这些数据的声明周期是在某一个函数调用完就结束,所以我们将其存放在数据段。

最后对于代码段,这里其实也可以称为静态区,因为它存放的内容依旧是一些常量。

二,C语言动态内存管理

在C语言中,我们会使用 malloc/calloc/realloc 这三个函数去开辟空间,而使用free函数去释放空间,那么具体对于这几个函数的使用,如果有小伙伴们有问题的话,可以查看up主这篇文件的解析哦!动态内存管理_菜还不承认的库森的博客-优快云博客目录前言:一,malloc函数与free函数1.1malloc函数基本内容1.2实例分析malloc函数以及free函数1.3free函数基本内容二,calloc动态内存分配函数2.1malloc函数基本情况2.2调试观察calloc函数三,realloc函数3.1realloc函数的由来3.2realloc的基础知识3.3realloc函数代码实现四,柔性数组前言:我们知道,对于C/C++程序内存分配来说:大致可以分为三个大区:栈区,堆区,静https://blog.youkuaiyun.com/qq_52777887/article/details/122814866?spm=1001.2014.3001.5501

三,C++动态内存管理

那么对于C++中动态内存管理,首先我们需要知道的是,C++是兼容C语言的,所以 malloc 一类的函数是可以在C++中使用的,但是因为考虑到一些只要C++中才能使用的影响因素,在C++中一般我们会使用 new/delete 来开辟和释放空间。

3.1new/delete 和 mallc/free 的区别

对于内置类型的区别

那么首先,我们需要分析一下对于内置类型,他们的区别在哪里。如下图所示:

我们看到,首先对于内置类型的动态内存开辟和释放两种方式基本是没有区别的。

但是其实对于多个空间的开辟与释放,new 和 delete 都是通过 [ ] 来实现的。这个是需要注意的,其次对于多个空间的初始化,new 只需要在括号后面家函数加上 { },然后进行初始化即可。

对于自定义类型的区别

那么对于自定义类型来说其实是一样的,不过有区别的是 new 会在为自定义类型开辟空间时,自动调用构造函数去初始化它,而 malloc 则不会,这就是区别。

其次,在释放空间时,对于自定义类型,对应的 delete 会自动调用析构函数,而 free 函数则不会调用。

也就是说,我们在使用自定义类型对象时,我们首先需要在使用之前初始化它,接着如果我们在初始化或者使用的时候使用了new等在堆上开辟了空间,这时候就会调用释放函数去释放它。

而现在不需要了,new/delete 会自动调用初始化和析构函数去帮我们实现初始化和释放操作。

异常处理机制不同

那么对于他们的不同,还有一个比较重要的地方,那就是异常处理。

malloc 在申请空间失败时,我们一般会采用一个强制退出的函数,并且打印出一个申请失败的字样,表示空间申请失败。但是我们发现,在C++中,这样的处理机制我们并不喜欢,因为C++是一门面向对象的语言,既然是面向对象,那么C++中就提出了 new 来开辟空间,一旦失败,它会使用 try catch 语句抛出异常,此时我们就能看到那为什么出错的一个信息。

这也是 new 和 malloc 的一个不同之处。

3.2底层调用

上面我们看了两种开空间方式的不同,显然来说,C++中使用 new 和 delete 是比较好的,因为他们会自动调用构造函数和析构函数。

如上图所示,其实从底层上来说,new 是通过调用全局函数  operator new 来开辟空间的,而 delete 是通过调用全局函数 operator delete 来释放空间的。

同时,对于全局函数 operator new 来说,其实它是通过 malloc 来申请空间的,不过它在申请空间失败时,会进行抛异常的操作。而同样的,operator delete 函数也是通过 free 来释放空间的,不过一般释放空间是不会出错的,如果有错的话,那么一定是野指针或者非法内存访问

四,内存泄露

好的,那么经过上面的了解。对于C++的基本内存管理,我们已经有了一个基本清晰的认知。

但是同时我们知道,既然有内存空间的开辟,那么我们有理由相信有时候我们会忘记释放,从而导致出现内存泄漏。

4.1什么是内存泄露?

所谓内存泄漏,就是因为不小心或者错误导致未释放不再使用的空间的情况。但是内存泄漏并不表示内存消失不见,而是因为我们的错误,导致这段内存不能再被使用,如此往复的话,有可能导致内存浪费越来越多,最后因为可用内存不足,导致系统崩溃。

4.2内存泄漏的几种情况

1.如果出现内存泄漏的进程正常结束,这些内存会在进程结束之后,自动归还给操作系统,这样的进程一旦出现内存泄漏也是没关系的。

2.如果出现内存泄漏的进程异常结束,这些内存则不会在结束时候还给操作系统,那么长此以往,就会导致操作系统宕机,出现不可挽回的损失。

3.如果需要长期运行的程序出现内存泄漏,短时间内是没问题的,如果时间长了之后,系统空间越来越少,最后也会导致操作系统直接宕机,损失同样是很大的。

所以,在以后的工作中一定不能忘记释放内存呀!

好的,那么对于C++的内存管理到这里就结束啦!如果觉得不错,还请各位大佬给个支持鸭!

本项目聚焦于利用Tensorflow框架搭建完整的卷积神经网络(CNN)以实现文本分类任务。文本分类是自然语言处理的关键应用,目的是将文本自动归类到预定义的类别中。项目涵盖从数据预处理到模型训练、评估及应用的全流程。 README.md文件详细阐述了项目概览、安装步骤、运行指南和注意事项,包括环境搭建、代码运行说明以及项目目标和预期结果的介绍。 train.py是模型训练的核心脚本。在Tensorflow中,首先定义模型结构,涵盖CNN的卷积层、池化层和全连接层。接着,加载数据并将其转换为适合模型输入的格式,如词嵌入。之后,设置损失函数(如交叉熵)和优化器(如Adam),并配置训练循环,包括批次大小和训练步数等。训练过程中,模型通过调整权重来最小化损失函数。 text_cnn.py文件包含CNN模型的具体实现细节,涉及卷积层、池化层的构建以及与全连接层的结合,形成完整模型。此外,还可能包含模型初始化、编译(设定损失函数和评估指标)及模型保存功能。 eval.py是用于模型评估的脚本,主要在验证集或测试集上运行模型,计算性能指标,如准确率、精确率、召回率和F1分数,以评估模型在未见过的数据上的表现。 data_helpers.py负责数据预处理,包括分词、构建词汇表、将文本转换为词向量(如使用预训练的Word2Vec或GloVe向量),以及数据划分(训练集、验证集和测试集)。该文件还可能包含数据批处理功能,以提高模型训练效率。 data文件夹存储了用于训练和评估的影评数据集,包含正负面评论的标注数据。数据预处理对模型性能至关重要。本项目提供了一个完整的端到端示例,是深度学习文本分类初学者的优质学习资源。通过阅读代码,可掌握利用Tensorflow构建CNN处理文本数据的方法,以及模型管理和评估技巧。同时,项目展示了如何使用大型文本数据集进行训练,这对提升模型泛化能力极为重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值