如果我声明一个指针用作"动态数组",如下所示:
int *arr;
Run Code Online (Sandbox Code Playgroud)
不使用new关键字或指定任何大小.
这是坏代码吗?这个指针到底指向哪里?
在这种情况下,让我说我初始化数组如下:
arr = new int[5];
Run Code Online (Sandbox Code Playgroud)
然后拨打这个电话(对我有用):
arr[100] = 10;
Run Code Online (Sandbox Code Playgroud)
我可以通过这种方式意外覆盖其他一些数据吗?(到目前为止,这从未发生在我身上).关于在此指针声明后剩余多少个连续块,是否存在"安全阈值"?
指针变量只是另一种变量.其值取决于其存储持续时间(未在您的问题中显示).
读取不确定的值会调用未定义的行为.执行此操作的程序编写错误 - 即使它们有时似乎有效.未定义的行为明确地对实现没有要求,包括在开始覆盖相邻数据之前不需要安全阈值.
但上面只涉及调用未定义行为的"动态"后果(这是大多数人倾向于关注的).未定义的行为甚至可能产生陌生的"静态"后果.
可以提前推断出调用未定义行为的代码(无论是针对所有情况还是针对代码中某些表达式的某些值)都允许编译器采取不那么明显的决策,包括删除函数调用甚至整个分支.代码,即使在与您无关的函数中(例如修改错误函数的调用者).Raymond Chen在一篇非常翔实的博客文章中对此进行了扩展(我经常将人们引用,因为它非常详细地突出了UB的"静态"后果).