在新的int [] []上删除或删除[]

时间:2017-02-01 23:09:33

标签: c++ arrays c++11

我一般都知道,如果您new是对象或主要数据类型的实例,则使用delete;如果您分配了new int[10]等数组,则可以通过delete[]释放内存。我刚刚遇到another source,并发现在C ++ 11中,你可以像这样建立一个多维数组:

auto arr = new int[10][10];

我的问题是:我应该使用delete还是应该使用delete[]?我会说delete[]看起来更正确,但delete不会导致以下程序崩溃:

#include <stdio.h>

int main() {
    for (int i = 0; i < 100000; i++) {
        cout << i << endl;
        auto ptr = new int[300][300][300];
        ptr[299][299][299] = i;
        delete ptr;  // both delete and delete[] work fine here
    }
    return 0;
}

为什么?

2 个答案:

答案 0 :(得分:5)

当分配的对象是一个数组(包括一个数组数组,,即一个多维数组)时,总是delete[]。当您应该使用delete时使用delete[],或者反之,是未定义的行为。它似乎可行,但无法保证。

答案 1 :(得分:1)

你可以在C ++ 11之前使用新的数组。

    auto p = new int[rand()][300][300];

C ++ 11只提供'自动'糖。

这不是三维动态数组,它只是第一个方向的动态,即二维数组的dymamic数组。

你可以说

    auto p = new int[300][rand()][300];

但你不能说

QProcess process;
QString program = "cmd.exe";
QStringList arguments = QStringList() << "/K" << "python.exe";
process.startDetached(program, arguments);

因为这是普通的动态数组,所以使用普通的delete []