int *p = new int[10];
delete [] p;
既然 delete 时无需提供数组大小,那么显然编译器是知道数组的大小(或者说界限的)。
那么
编译器是如何知道数组大小的?(比如维护了一张表、按特定格式存储……)
既然知道数组大小,编译器能否自动检查数组越界的情况?不检查是否是为了性能?
编程时如何利用这份信息?
另外,不借助搜索引擎如何解答这个问题,有类似文档之类的东西可以参考吗?修改
1:拿msvc来说,在new/malloc返回的ptr前n个字节里保存了大小,msvc还可以用_msize()来获得size,具体保存在哪可以调试看看;
2:编译器未必知道,有些size是运行时决定的.真正记录大小是在运行时,而不是编译期.数组越界不能自动检查,ptr + offset,这种方式程序无法知道程序员的本意要访问的到底是不是数组那块内存
3:特定环境下可能有用啊.(例:一个妹子问我在vs里怎么通过一个new出来的指针获得size,然后就可以利用这些信息换妹子崇拜的眼神)
PS:上调试器.
作者:吉林小伙
链接:https://www.zhihu.com/question/27112272/answer/35301722
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1:new的时候已经多new了点空间把长度写进去了
2:不能检查,因为不是所有的指针都是new出来,谁知道到底指向的是什么
3:根据C++标准的话,没办法利用
4:反正VC++已经98%以上跟标准完全一致了,而且gcc跟clang的私货也不比VC++少,你去msdn看C++语法手册就好了 C++ Language Reference,手册只要你读两遍,你就什么都明白了。我初三就是读了两遍VC++5.0时代的msdn的语法手册学会C++的。当然要熟悉还是要靠练习,光读的话就算都记住了,也只能一知半解。
作者:vczh
链接:https://www.zhihu.com/question/27112272/answer/35291952
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。