C++ delete []p 数组指针,如何知道该数组大小的
2014-07-13 20:48
441 查看
来看一段代码:
第一个问题:为什么数组指针buf在拷贝越界的时候(所指向的数组大小只有4,而拷贝进去的大小却是11),为何打印的时候也没有报错呢?
这个问题百度还是很好找,cout<<标准输出,字符串数组指针,碰到'\0'才会认为字符串结束(这也是为什么我们<<buf就可以直接将整个字符串打印出来,buf不是指数组首地址吗?),越界拷贝虽然违规了,但是运行还是没有问题,
因为我们只是可以读取越界后的字符而已。
第二个问题:为什么我们delete []buf会报错?
我们可以看到到指针buf指向的数组大小只有4个字节,但是如果只delete 这四个以分配好的字节空间应该也不会有问题啊,肯定有什么地方给扰乱了。
第三个问题:那编译器是怎么知道这个数组大小的?
这个问题承接第二个问题,因为通过指针我们是没法知道它所指向的对象的大小的。
根据Inside The C++ Object Model上所言,现在的编译器大多使用两种方法, 一种是cookie, 一个记录分配空间大小的内存小块绑定在分配内存的地址头部。二是使用表来对分配了的指针进行管理,每一个分配了空间的指针都在表中对应着分配空间的大小。
在VC 上,是通过第一种方式记录的,即:VC对于数组的大小信息存放在:"数组首地址 - 4 * sizeof(int)"之中,我们可以添加以下代码:
在这里你可以更改前面代码*buf指针所指向数组初始化时的大小,会发现这里都会与之相同,而不管strcpy拷贝的时候往数组地址边界后塞了多少东西。
那这样来看,编译器如果只根据cookie记录的数组大小去释放理应是不会报错的.
至于原因,我目前还不清楚,欢迎各位看官指点迷津.....
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<<标准输出,字符串数组指针,碰到'\0'才会认为字符串结束(这也是为什么我们<<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记录的数组大小去释放理应是不会报错的.
至于原因,我目前还不清楚,欢迎各位看官指点迷津.....
相关文章推荐
- C++ delete[] 是如何知道数组大小的?
- 【探讨】C++ delete[] 是如何知道数组大小的
- reinterpret_cast的使用和delete[] 如何知道数组的大小
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- C/C++如何返回一个数组/指针
- 编译器delete [] 时如何知道数组长度
- 【Q&A】delete (free)如何知道被删除的数组的元组个数?
- c++未知数组大小如何创建
- C++学习笔记六之函数如何使用指针来处理数组?
- c++: 获取delete[]中的数组大小
- 如何求数组的大小 C++
- c++中如何使二级指针能够像数组下标模式访问
- [互联网面试笔试汇总C/C++-20] 如何申请一个大小为n的数组(一维或二维)
- c++如何定义不知道大小的数组
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- Windows 上C++ new/detele如何知道内存大小
- 【数组与指针】如何在C/C++中动态分配二维数组
- C++中new和delete在数组指针和指针数组中的调用
- c++如何获得数组的大小
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765