删除 C++ 中的指针:“删除 p”是什么意思?

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 时?

运行代码时不应该出现分段错误吗?

Mik*_*ine 5

正如一位聪明的中国老和尚曾经说过的那样,“未定义的行为是未定义的”。

说真的,尝试delete不是newd 的东西是未定义的。

c 和 c++ 都将它们的大部分意外功能定义为“未定义”。这意味着当你有这样的行为时,你不知道会发生什么。如果你真的很幸运,它会出现段错误或类似的错误。更常见的是,奇怪和莫名其妙的事情会发生,试图对它们进行推理在很大程度上毫无意义。

这样做的主要原因是编译器的实现既可以更简单,也可以更优化。

作为 C++ 程序员,我建议您阅读未定义行为、未指定行为和实现定义行为。它们都是理解任何适度有趣的 C++ 代码将如何运行的基础。

LLVM 项目关于未定义行为的博客是一本很好的读物