Jat*_*tin -3 c++ pointers delete-operator
#include <iostream>
#include <cstdio>
using namespace std;
int main(void)
{
int arr[] = {1,4,2,3,5,6};
int *p = arr;
delete p;
for(int i = 0 ; i < 6; i++)
cout << p[i];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是142356。当我说delete p为什么不删除 p 时?
运行代码时不应该出现分段错误吗?
正如一位聪明的中国老和尚曾经说过的那样,“未定义的行为是未定义的”。
说真的,尝试delete不是newd 的东西是未定义的。
c 和 c++ 都将它们的大部分意外功能定义为“未定义”。这意味着当你有这样的行为时,你不知道会发生什么。如果你真的很幸运,它会出现段错误或类似的错误。更常见的是,奇怪和莫名其妙的事情会发生,试图对它们进行推理在很大程度上毫无意义。
这样做的主要原因是编译器的实现既可以更简单,也可以更优化。
作为 C++ 程序员,我建议您阅读未定义行为、未指定行为和实现定义行为。它们都是理解任何适度有趣的 C++ 代码将如何运行的基础。
LLVM 项目关于未定义行为的博客是一本很好的读物