C++ delete []p 数组指针,如何知道该数组大小的

阅读: 评论:0

C++ delete []p 数组指针,如何知道该数组大小的

C++ delete []p 数组指针,如何知道该数组大小的

void main()    
{char p[6];char *buf = new char[4];strcpy(buf,"012356789");//这里越界不会报错strcpy(p,"Hello"); //若此处越界立即报错cout<<p<<endl;cout<<buf<<endl;delete []buf;  //buf拷贝越界,这里释放数组报错
}

第一个问题:为什么数组指针buf在拷贝越界的时候(所指向的数组大小只有4,而拷贝进去的大小却是11),为何打印的时候也没有报错呢?

  这个问题百度还是很好找,cout<<标准输出,字符串数组指针,碰到''才会认为字符串结束(这也是为什么我们<<buf就可以直接将整个字符串打印出来,buf不是指数组首地址吗?),越界拷贝虽然违规了,但是运行还是没有问题,

因为我们只是可以读取越界后的字符而已。

第二个问题:为什么我们delete []buf会报错?

  我们可以看到到指针buf指向的数组大小只有4个字节,但是如果只delete 这四个以分配好的字节空间应该也不会有问题啊,肯定有什么地方给扰乱了。

第三个问题:那编译器是怎么知道这个数组大小的?

  这个问题承接第二个问题,因为通过指针我们是没法知道它所指向的对象的大小的。

  根据Inside The C++ Object Model上所言,现在的编译器大多使用两种方法, 一种是cookie, 一个记录分配空间大小的内存小块绑定在分配内存的地址头部。二是使用表来对分配了的指针进行管理,每一个分配了空间的指针都在表中对应着分配空间的大小。

  在VC 上,是通过第一种方式记录的,即:VC对于数组的大小信息存放在:"数组首地址 - 4 * sizeof(int)"之中,我们可以添加以下代码:

cout<<"begin print size = "<< *reinterpret_cast<int*>(reinterpret_cast<char*>(buf) - 4 * sizeof(int))<<endl;

在这里你可以更改前面代码*buf指针所指向数组初始化时的大小,会发现这里都会与之相同,而不管strcpy拷贝的时候往数组地址边界后塞了多少东西。

那这样来看,编译器如果只根据cookie记录的数组大小去释放理应是不会报错的.

本文发布于:2024-02-04 19:30:55,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170714806858811.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数组   指针   知道该   大小   delete
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23