使用未分配的内存而不会出错?
为什么行得通?
#include <iostream>using namespace std;
int main() {
float* tab[3];
int i = 0;
while(i < 3) {
tab[i] = new float[3-i];
i++;
}
cout << tab[2][7] << endl;
tab[2][7] = 6.87;
cout << tab[2][7] << endl;
i = 0;
while(i < 3)
delete[] tab[i];
}
而这不是吗?
#include <iostream>using namespace std;
int main() {
float* tab = new float[3];
cout << tab[7] << endl;
tab[7] = 6.87;
cout << tab[7] << endl;
delete[] tab;
}
我在带有MS VS 2008的Win
XP上尝试了这两个程序,均已编译且没有错误,并且第一个程序运行无任何错误。第二个弹出一些错误窗口,但是我不记得它并且无法复制(此刻无法访问Windows)。
我还在具有g ++的Linux(Kubuntu 10.10,预编译的内核软件包版本2.6.35.23.25)上进行了尝试,并且可以编译并运行而没有任何错误。
为什么?是否应该出现诸如“错误地访问未分配的内存”之类的弹出窗口?
我知道它应该(并且幸运地)编译时没有错误,但是我认为它应该在没有错误的情况下运行…为什么第二个示例在Windows而不是Linux上出错?
回答:
使用未分配的内存会导致未定义的行为。即使在同一系统和编译器上执行此操作,也无法期望会发生什么,更不用说跨硬件和编译器的不同组合了。
该程序可能会立即崩溃,可能会工作一段时间,然后稍后失败,甚至可能会正常运行。
但是,访问您不拥有的内存总是一个编程错误。不要将正确操作的外观视为“有时会起作用”,而应将其视为“我真的很不幸,并且我的错误没有很快显示出来”。
以上是 使用未分配的内存而不会出错? 的全部内容, 来源链接: utcz.com/qa/397582.html