技术贴--内存管理1(需回复)
本帖最后由 青云风力 于 2016-10-22 20:16 编辑这是我在鱼C 第三次发帖了。前面两篇都是我C++学习的线路和建议。大家可以到我的空间找一下。我的水平还没有达到能够结构化的介绍内存管理的知识,所以题目的标号,只是发帖的顺序。
接下来就进入正题了,如果你的有一点水平,应该就听说过内存泄露是怎么回事,而不只是仅限于听说过。这里简单的介绍下内存泄露。加入我们使用 int* p = new int;来申请到了10个int的空间(实际上不是10个int,这下面会说)。但是经过了一些代码,使用者释放的时候却是这么做的: delete p; 大部分人都知道这么做是错的,会造成内存泄露。实际上应该是 delete[] p; 。这篇帖子会简单的介绍内存泄露究竟是怎么回事。
解决问题的第一步是我们使用 int *p = new int;究竟申请到了多少内存?如果没有刻意地去了解这方面的知识的人,就会觉得申请到了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个字节的大小。**** Hidden Message *****
回复见然后
new到的内存块大小的维护方式由编译器作者觉得
并不只有一种方式
你的描述以偏概全了
而且 这个大小是对使用者透明的
使用者不可以去读写 new到的10个int以外的内存块
有越界风险 delete [ ] p; 实际上有没有那个中括号都行
new[] 必须对应 delete[]
单纯从语法上讲
new[]使用delete 是未定义行为
ps 未定义行为是C/C++编程的一个大坑 必须了解 如果你不懂 请自行百度
从实现上来讲
对于一个类 使用 new[]之后使用delete
会只调用一次析构函数
如果析构函数里面有做内存释放之类的收尾工作
只调用一次析构函数会造成内存泄露 开来看看 。但是这三个指针所指的空间并没有被释放
解释错了
从常见实现的角度
new string
之后delete
会调用第一个string的析构函数
所以第一个string对象的数据指针指向的内存是能被正确释放的
但是第二个和第三个string 数据指针对象就没能正确释放
所以 应该是有2块内存泄露 而不是3块 求道于盲 发表于 2016-10-24 01:25
解释错了
从常见实现的角度
new string
多谢,好像是有这样的。水平有限,见谅。 求道于盲 发表于 2016-10-24 01:25
解释错了
从常见实现的角度
new string
能留个微信吗?仅是交流,不骚扰。
页:
[1]