在C++中删除[]

pex*_*a12 -1 c++ pointers

我在C++中的void delete []有一些问题这是我的代码:

#include<iostream>

int main(){
    int *p = new int[1000];
    for (int i = 1; i <= 1000; ++i)
        p[i] = i;
    delete [] p;
    for (int i = 0; i <= 1000; ++i)
        std::cout << std::endl << p[i];
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,当我调用delete [] p时,必须删除指针p.但是,在调用delete [] p后,我仍然可以将它打印到屏幕上.谁能解释为什么?

BoB*_*ish 6

这是未定义的行为.当您根据语言规则执行某些操作时,您的程序可以执行任何操作.

C++(和其他语言,特别是C)具有未定义的行为,因为它允许编译器在特定的硬件+ os组合上提出最有效的实现.为什么编译器每次都要支付检查此内存的成本,以便在这种情况下提供一致的行为,此时无论如何都无法访问内存?

有时可能看起来有效,有时它可能会崩溃,有时可能会让你的袜子着火.不太可能,但完全合法的语言规则.

在这种特殊情况下,语言不允许在删除后使用该内存.事实上,系统还没有做任何事情来清空那个内存,或者让你的程序无法访问它.但这并不意味着这种行为无论如何都会得到保证.另一个可能的结果是分段错误,如果系统确实使该内存不可访问.但同样,没有保证.

您可以在此处阅读有关C++中其他未定义行为的信息.

您还应该考虑获得一本好的C++书籍,它将教您避免这些错误.