关于C/C++动态申请空间释放和内存泄漏问题介绍

2023-10-27

1. 动态申请空间

1.1 基本内容

  Ⅰ 动态申请的空间没有具体名称,只能通过指针间接访问(无论new还是malloc方式)。
  Ⅱ 动态申请空间都是存放在堆中,有别于系统自动分配的空间是存放在堆栈中(即栈)。
  Ⅲ 栈中系统分配的空间,在使用结束会自动释放。而程序员动态申请的空间则需要人为来释放,否则随着程序运行,内存占用积累,很容易造成内存泄漏,尤其在程序过大,运行时间过长的时候,更需要这些每个细节问题。

1.2 常见空间申请方式

1.2.1 malloc/free申请空间

  malloc/free是声明在c语言stdlib.h(或者c++语言的 cstdlib)头文件中,调用的时候记得添加头文件。
  具体格式如下:   

#include<stdlib.h> 
int nLen =100;
char* pl;
pl=(char*)malloc(nLen*sizeof(char));//申请nLen长度的存储char类型大小的空间

free(pl);   //使用结束,释放空间 

  这里需要注意,空间申请的大小与形式,跟数据类型无关,它就是动态分配的一段地址。即malloc申请的空间是没有类型概念的,最后赋给具体指向哪种类型的指针,仅需强制转换到相应类型即可。
  例如:

char* pl = (char*)malloc(10 * sizeof(int));

  上面程序虽然申请了10个长度存储int类型大小的空间,但跟赋给指向char类型的指针并不存在矛盾,地址是没有数据类型概念的。

1.2.1 new/delete申请空间

  C中已经有了malloc/free,那为什么还需要new/delete呢?自然是前者不能满足c++中增加的关于类处理相关操作。
  由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
  也就是说new既能申请类对象空间,也能调用构造函数。
  具体使用如下:

//变量
int* nNum = new int(5);   //注意申请简单变量,也必须使用指针形式

delete nNum;              //释放空间
nNum = NULL;              //让指针指向空指针,杜绝野地址
//一维数组
int* nNum1 = new int[5];  

delete []nNum1;            //释放空间,记住与变量不同
nNum1 = NULL;
//二维数组
int (*pl)[4]              //必须点明列大小
pl = new int[3][4];

delete []pl;
pl = NULL;

2. 动态申请空间内存泄漏问题

  每个程序都包含一或多个进程运行,而每个进程都有自己的进程堆。虽然程序中动态申请的空间如果没有手动释放,在程序运行结束,也就是所有进程消亡后,系统也会将进程中申请的所有的内存资源全部释放。但是如果一旦程序运行时间过程,或者程序占用内存过大,进程就会耗尽系统所有内存,最终造成内存泄漏。
  所以避免程序出现内存泄漏的最好办法是,当使用动态空间完毕后,我们应该人为释放内存空间。
  


个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C/C++动态申请空间释放和内存泄漏问题介绍 的相关文章

  • 在不同的函数中分配的空闲内存?

    我正在尝试学习 C 目前正在尝试编写基本的堆栈数据结构 但我似乎无法掌握基本的知识malloc free right 这是我一直在使用的代码 我只是在这里发布一小部分来说明特定问题 而不是全部代码 但错误消息是通过运行此示例代码生成的val
  • 如何将 malloc 返回的指针视为多维数组?

    有没有办法告诉编译器我已经分配了大小为 N M 的内存 并且我想将此指针视为 N M 数组 换句话说 有没有办法写这样的东西 int arr N M int N M malloc N M sizeof int arr x y 123 我知道
  • C++中的引用

    一 引用的概念 引用不是新定义一个变量 而是给已有变量取一个别名 编译器不会为引用变量开辟内存空间 而和它引用的变量共用一块内存空间 注意 由于C 兼容C 所以 既可以是引用符号 也可以是取地址 int a 0 int b a cout l
  • C++ new / new[],它是如何分配内存的?

    我现在想知道这些指令如何分配内存 例如 如果我得到代码怎么办 x new int 5 y new int 5 如果这些都被分配了 那么它在 RAM 中的实际情况是什么样的 是否为每个变量保留整个块 或者块 内存页或如何称呼它 32 位上的
  • 为字符数组分配内存以连接已知的文本片段和整数

    我想将一段文本 例如 答案是 与有符号整数连接起来 以给出输出 数字是 42 我知道这段文本有多长 14 个字符 但我不知道数字的字符串表示形式有多少个字符 我假设最坏的情况 最大的有符号 16 位整数有 5 位 再加上一位以防负数 那么下
  • 为什么在释放指针后取消引用它时会得到不同的结果?

    我有一个关于 C 内存管理的问题 以及 Debian GNU Linux 下的 GCC 4 3 3 根据 K R 的 C 编程语言书籍 第 7 8 5 章 当我释放指针然后取消引用它时 会出现错误 但我有一些疑问 因为我注意到有时 正如我在
  • 如何在c中找到内存分配的最大限制

    我想确定我可以在计算机中分配的最大内存限制是多少 这是我为此任务编写的代码 include
  • calloc 与 malloc 以及时间效率

    我饶有兴趣地阅读了这篇文章C malloc和calloc的区别 https stackoverflow com questions 1538420 c difference between malloc and calloc 我在代码中使用
  • 为什么gcc中malloc将值初始化为0?

    可能各个平台的情况不一样 但是 当我使用 gcc 编译并运行下面的代码时 我在 ubuntu 11 10 中每次都得到 0 include
  • C malloc valgrind 大小写入无效

    我曾经遇到过公平份额 malloc 无效写入 以及本网站上的许多示例 但我仍然无法指出导致某些写入的原因 这里我有一个用于图形的邻接矩阵 在分配时 我从 valgrind 获得无效写入 但整个程序中没有分段错误 我也得到无效的读取 但我认为
  • Xcode 4:由于 iPad 模拟器的 dylib 错误,无法使用启用 Guard Malloc

    在 Xcode 4 x 中 我已将运行方案编辑为 启用 Guard Malloc 因为我有一个需要追踪的不伦不类的 malloc 错误 我知道我需要在模拟器中运行才能使用此功能 然而 当我这样做时 应用程序立即冻结 并且 Xcode 向我显
  • C++,new 与 malloc 返回值

    当我学会的时候C99我被告知要始终检查返回值malloc检查它是成功还是失败 但现在我开始学习C 我被告知不需要使用关键字来执行此操作new 并且您可以假设它始终对您有用 但这是为什么呢 new仍然可能失败并抛出一个std bad allo
  • 进程资源不受 setrlimit 限制

    我编写了一个简单的程序 将其数据大小限制为 65Kb 并验证相同的情况 我分配了超过 65Kb 的虚拟内存 从逻辑上讲 如果我执行了所有正确的操作 如下所示 那么 malloc 调用应该会失败 不是吗 include
  • sbrk 在 malloc.c 中如何/在何处使用?

    我在 高级 Unix 编程 以及其他几本书 中读到 Linuxmalloc 使用Linux系统调用sbrk 向操作系统请求内存 我正在看 glibcmalloc c代码 我可以看到很多提及sbrk 在注释中 但没有在代码中直接引用 如何 在
  • C++ New 与 Malloc 用于对象的动态内存数组

    我有一个 Bullet 类 它的构造需要几个参数 但是 我使用动态内存阵列来存储它们 我正在使用 C 所以我想通过使用 new 运算符来分配内存来符合它的标准 问题是当我分配数组时 new 运算符要求构造函数参数 而当时我没有 我可以使用
  • C 语言快速联合实现中的分段错误(核心转储)

    include
  • free() 是否跟随指针?

    我确信不是 但也许其中有黑魔法 所以这是我的问题 如果我有这样的结构 struct mystr char strp unsigned int foo 我为它分配了内存并想稍后释放它 我必须做吗 free mystr var gt strp
  • 函数插入仅适用于 malloc 而不是 free

    我在通过使用函数插入来监视 malloc 和 free 时遇到了一个小问题 当仅对 malloc 执行函数插入时 它按预期工作 然而 当尝试插入 free 时 它 最终会陷入循环 我似乎 free 被递归调用 但我只是不知道为什么 这是 m
  • Malloc 的字符串包含垃圾值

    我刚刚将 Objective C 库转换为 C 库 希望能够跨平台 然而 在我将这件事发送出去进行处理之前 一切似乎都正常 就在我收到错误的时候 回顾一些修改 我注意到调试器中的一些东西 就在 malloc 的字符串之后 如下所示 char
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText

随机推荐

  • 差分+差分矩阵(更适合新手宝宝体质)

    快速掌握差分以及差分矩阵 文章目录 快速掌握差分以及差分矩阵 前言 差分 差分的定义 官方解释 差分自定义 跟前缀和放在一起理解 差分数组的应用 题目描述 差分矩阵 与前缀和矩阵进行比较 差分矩阵定义 官方解释 自定义 修改操作 跟前缀和对
  • openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

    文章目录 openGauss学习笔记 43 openGauss 高级数据管理 事件触发器 43 1 语法格式 43 2 参数说明 43 3 示例 openGauss学习笔记 43 openGauss 高级数据管理 事件触发器 触发器会在指定
  • 物联网毕业设计 基于STM32的环境质量监测系统(源码+原理图+论文)

    文章目录 0 前言 1 设计架构 功能设计 2 原理图 3 软件设计 4 实现效果 5 相关代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟
  • 傻白入门芯片设计,三大基本定律(十)

    1 摩尔定律 Moore s Law 集成电路上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍 换言之 处理器的性能大约每两年翻一倍 同时价格下降为之前的一半 2 登纳德缩放定律 Dennard Scaling 随着晶体管尺
  • 2023.3.17

    Goby预置了最具攻击效果的漏洞引擎 覆盖Weblogic Tomcat等最严重漏洞 每天从互联网 如CVE 会产生大量的漏洞信息 我们筛选了会被用于真实攻击的漏洞进行每日更新 Goby也提供了可以自定义的漏洞检查框架 发动了互联网的大量安
  • go数组转tree

    数组转 tree目前发现就二种方式 go实现了两种 1 递归模式 2 双重循环 初始化数据 List 结构体 type List struct Name string json name Id int json id Pid int jso
  • (Struts2学习篇) Struts2 拦截器

    版本 struts2 5 5 此实例实现功能 用户需要指定用户名登陆 登陆成功进入相应页面执行操作 否则返回到登陆页面进行登陆 当直接访问操作页面 登陆后才能访问的页面 时则不允许 须返回登陆页面 1 Struts xml配置文件
  • [Ubuntu]安装微信/QQ/TIM的简便方法

    之前尝试过很多在Ubuntu上安装微信 QQ TIM等软件的方法 大多数都是使用Deepin wine再加 deb安装包来完成的 虽然也可以用 但是有时会有各种兼容问题出现 以前没有计较过 都是一个个解决 凑活着用 现在 偶然间找到一个可以
  • SOLO算法学习

    SOLO神经网络学习 在博客的最开始 先简单谈谈图像处理的几大目标 首先是最基本的目标分类 Object Classification 输出结果 图像中是气球 然后目标检测 Object detection 是在图像分类的基础上 给出每个气
  • 【转载】Chrome插件(扩展应用)开发全攻略

    背景 遇到了一些大量重复操作的任务 需要从页面上获取信息 查询对应的说明 整理出对应内容 然后录入到页面 提交保存 操作过程很繁琐 内容需要人为去做细微的修改 无法完全模板化 所以不好批量处理 鉴于此 考虑使用chrome插件 简化其中一些
  • VC++ CString Find函数的用法说明

    名称 CString Find 在一个较大的 字符 串中查找字符或子字符串 int Find TCHAR ch const int Find LPCTSTR lpszSub const int Find TCHAR ch int nStar
  • pycharm入门

    pycharm基础使用步骤 1 下载pycharm 2 新建Python工程 1 如下 点击Create New Project 2 选择保存位置 点击create 3 命名 打开界面如下 4 这时就可以创建文件了 项目文件夹右击new g
  • 全面探索 FreeMarker 模版引擎的扩展性

    FreeMarker 模版引擎简介 FreeMarker 是一个采用 Java 开发的模版引擎 是一个基于模版生成文本的通用工具 FreeMarker 被设计用来生成 HTML Web 页面 特别是基于 MVC 模式的应用程序 虽然 Fre
  • xxxx is deprecated

    编译工程发现json object object get is deprecated 最终解决 jason c库中有声明 deprecated Please use json object object get ex json c库编译的时
  • 中国银行业数字化转型研究报告 附下载

    以在数据化 智能化为特征的数字化转型是银行业的一次产业革命 以支付功能的在线化为例 近年来移动支付领域的 脱媒 给银行上了生动的一课 即使是全国性的大型银行 面对互联网公司的 降维 竞争也是无能为力 区域性银行更是全面失守 这种数字化金融服
  • 如何阻止点击其他区域,input框会失去焦点事件

    如何阻止点击其他区域 input输入框会失去焦点位置 阻止失去焦点 通过a标签 设置user select为none 通过js阻止默认事件 通过内联js实现 在开发过程中 总会碰到以下两个情况 要求点击某个区域 阻止input框 或者设置了
  • 1.30 fcntl函数

    include
  • 什么是super?如何使用super调用超类构造函数?

    从之前的文章中分享过的一些知识 从Box派生的类并没有体现出它们的实际上是多么有效和强大 例如 BoxWeight构造函数明确的初始化了Box 的width height和depth成员 这些重复的代码在它的超类中已经存在 这样做效率很低
  • 7-40 一维数组最大值和最小值交换 (10 分)

    找出含有10个元素一维数组中的最大值和最小值 并互换这两个数的位置 输入格式 在一行中输入10个整数 数据之间只能用1个空格间隔 输出格式 在一行中按照 max 最大值 min 最小值 的格式输出结果 最大值和最小值均原样输出 没有列宽控制
  • 关于C/C++动态申请空间释放和内存泄漏问题介绍

    1 动态申请空间 1 1 基本内容 动态申请的空间没有具体名称 只能通过指针间接访问 无论new还是malloc方式 动态申请空间都是存放在堆中 有别于系统自动分配的空间是存放在堆栈中 即栈 栈中系统分配的空间 在使用结束会自动释放 而程序