一尘不染

使用未分配的内存而不会出错?

linux

为什么行得通?

#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上出错?


阅读 343

收藏
2020-06-03

共1个答案

一尘不染

使用未分配的内存会导致未定义的行为。即使在同一系统和编译器上执行此操作,也无法期望会发生什么,更不用说跨硬件和编译器的不同组合了。

该程序可能会立即崩溃,可能会工作一段时间,然后稍后失败,甚至可能会正常运行。

但是,访问您不拥有的内存总是一个编程错误。不要将正确操作的外观视为“有时会起作用”,而应将其视为“我真的很不幸,并且我的错误没有很快显示出来”。

2020-06-03