为什么行得通?
#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上出错?
使用未分配的内存会导致未定义的行为。即使在同一系统和编译器上执行此操作,也无法期望会发生什么,更不用说跨硬件和编译器的不同组合了。
该程序可能会立即崩溃,可能会工作一段时间,然后稍后失败,甚至可能会正常运行。
但是,访问您不拥有的内存总是一个编程错误。不要将正确操作的外观视为“有时会起作用”,而应将其视为“我真的很不幸,并且我的错误没有很快显示出来”。