Sun/Sparc 环境
运行结果如下
对于char *ch = new char[256-8];的内存分配, Sun/Sparc会分配额外的8个字符长度, 在ch开始之前, 这8个字符长度用来记录实际的数组长度+1.
如上以ch2为例, 它的起始地址为ch2=40d98, 从这个地址开始依次存储了字符串"12345", 而在这个地址前的第8字节, 存储了一个数字值(249=256-8+1=字符数组长度+1)
所以以后如果执行
- delete ch2;
只会把ch2地址对应的第一个字符空间给释放, 造成memory leak.
- delete []ch2;
会从(ch2-8)开始的位置读出字符数组长度, 然后才能把所有的数组都删除
为什么是ch-8我觉得是数组的最大可定义长度了, sizeof(long long) = 8吧, 在32bits系统下面。
本文深入探讨了在Sun/Sparc环境下使用C++进行内存分配及指针操作时的细节,特别是关于char类型数组初始化后在内存中的布局以及如何正确管理内存以避免内存泄露的问题。

308

被折叠的 条评论
为什么被折叠?



