鱼C论坛

 找回密码
 立即注册
查看: 1815|回复: 7

[技术交流] 技术贴--内存管理1(需回复)

[复制链接]
发表于 2016-10-22 18:50:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 青云风力 于 2016-10-22 20:16 编辑


        这是我在鱼C 第三次发帖了。前面两篇都是我C++学习的线路和建议。大家可以到我的空间找一下。我的水平还没有达到能够结构化的介绍内存管理的知识,所以题目的标号,只是发帖的顺序。
        接下来就进入正题了,如果你的有一点水平,应该就听说过内存泄露是怎么回事,而不只是仅限于听说过。这里简单的介绍下内存泄露。加入我们使用 int* p = new int[10];来申请到了10个int的空间(实际上不是10个int,这下面会说)。但是经过了一些代码,使用者释放的时候却是这么做的: delete p; 大部分人都知道这么做是错的,会造成内存泄露。实际上应该是 delete[] p; 。这篇帖子会简单的介绍内存泄露究竟是怎么回事。
        解决问题的第一步是我们使用 int *p = new int[10];究竟申请到了多少内存?如果没有刻意地去了解这方面的知识的人,就会觉得申请到了10个int,但事实不是如此。 我在linux下不方便画图,但是我会用最简洁的语言去描述,读者可以那一支笔一张纸画画结构图。首先,除了我们申请的10个int之外,操作系统会在这10个int的上下各加上两个4字节的cookie,这两个cookie的作用简单的理解就是记录这两个cookie中间夹的内存空间的信息。好,这下我们算一下,数据类型的大小ISO没有定下标准,但绝大多数情况,int是4个字节的大小。10*4+2*4=48 ,在10个int的上方,上cookie下方会有一个4个字节的大小的空间,用来记录究竟使用者究竟申请了多少内存,现在这种情况下记录的是10,这下我们知道了,我们实际上得到的是52个字节的大小。
游客,如果您要查看本帖隐藏内容请回复

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-22 22:46:07 | 显示全部楼层
回复见然后
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 01:19:09 | 显示全部楼层
new到的内存块大小的维护方式由编译器作者觉得
并不只有一种方式
你的描述以偏概全了
而且 这个大小是对使用者透明的
使用者不可以去读写 new到的10个int以外的内存块
有越界风险
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 01:22:04 | 显示全部楼层
delete [ ] p; 实际上有没有那个中括号都行

new[] 必须对应 delete[]
单纯从语法上讲
new[]使用delete 是未定义行为
ps 未定义行为是C/C++编程的一个大坑 必须了解 如果你不懂 请自行百度

从实现上来讲
对于一个类 使用 new[]之后使用delete
会只调用一次析构函数
如果析构函数里面有做内存释放之类的收尾工作
只调用一次析构函数会造成内存泄露
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 01:23:21 From FishC Mobile | 显示全部楼层
开来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 01:25:08 | 显示全部楼层
。但是这三个指针所指的空间并没有被释放
解释错了
从常见实现的角度
new string[3]
之后delete
会调用第一个string的析构函数
所以第一个string对象的数据指针指向的内存是能被正确释放的
但是第二个和第三个string 数据指针对象就没能正确释放
所以 应该是有2块内存泄露 而不是3块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-29 23:21:05 | 显示全部楼层
求道于盲 发表于 2016-10-24 01:25
解释错了
从常见实现的角度
new string[3]

多谢,好像是有这样的。水平有限,见谅。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-29 23:23:09 | 显示全部楼层
求道于盲 发表于 2016-10-24 01:25
解释错了
从常见实现的角度
new string[3]

能留个微信吗?仅是交流,不骚扰。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表