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系统下面。