我在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后,我仍然可以将它打印到屏幕上.谁能解释为什么?
这是未定义的行为.当您根据语言规则执行某些操作时,您的程序可以执行任何操作.
C++(和其他语言,特别是C)具有未定义的行为,因为它允许编译器在特定的硬件+ os组合上提出最有效的实现.为什么编译器每次都要支付检查此内存的成本,以便在这种情况下提供一致的行为,此时无论如何都无法访问内存?
有时可能看起来有效,有时它可能会崩溃,有时可能会让你的袜子着火.不太可能,但完全合法的语言规则.
在这种特殊情况下,语言不允许在删除后使用该内存.事实上,系统还没有做任何事情来清空那个内存,或者让你的程序无法访问它.但这并不意味着这种行为无论如何都会得到保证.另一个可能的结果是分段错误,如果系统确实使该内存不可访问.但同样,没有保证.
您还应该考虑获得一本好的C++书籍,它将教您避免这些错误.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |