0

当我开始使用 C++ 编程时,我学会了使用动态内存分配来分配数组大小,如下所示:

int main()
{
    int nArrayLength;

    cout << "Enter an array length: ";
    cin  >> nArrayLength;

    int *nArray = new int[nArrayLength];

    // contents

    delete[] nArray;

    return 0;
}

现在,我使用 Code::Blocks 12.11 和 mingw32-g++ // GNU GCC 编译器尝试了以下代码。

int main()
{
    int nArrayLength;

    cout << "Enter an array length: ";
    cin  >> nArrayLength;

    int nArray[nArrayLength];

    return 0;
}

这也很好用。

因此,当更简单的方法也可以正常工作时,我为什么要在这种情况下使用动态内存分配?

4

5 回答 5

7

你不应该使用。

第一个是有效的,但它是 C 风格的代码。第二个是非标准代码 - 由于某些扩展,它被该编译器接受。

使用 astd::vector代替:

#include <vector>
int main()
{
    int nArrayLength;

    cout << "Enter an array length: ";
    cin  >> nArrayLength;

    std::vector<int> nArray(nArrayLength);

    return 0;
}

Avector与数组具有相同的语义,它可以动态(自动)增长,并在后台完成所有讨厌的内存管理。

于 2013-05-02T11:28:53.860 回答
3

第二个代码不是有效的标准 C++。它使用称为可变长度数组的编译器扩展。请参阅GCC 文档

但是,C++14 已经采用了具有自动存储持续时间的可变长度数组的提议。

于 2013-05-02T11:27:43.830 回答
1

-pedantic如果您使用的是 GCC,请使用选项编译第二个代码。它不会编译。

这是因为它不符合标准。可变长度数组 (VLA) 不在标准 C++ 中。它是一个编译器扩展。

于 2013-05-02T11:29:34.183 回答
0

有时您事先不知道数组的大小,因此您需要为其分配可能动态增长或缩小的存储空间。您应该使用std::vector它,因为它透明地管理阵列存储。

如果您被迫使用 C 风格的数组,请像在第一个代码片段中一样使用它们,第二个不是标准 C++。

于 2013-05-02T11:33:55.950 回答
0

这取决于您是要使用堆栈还是堆。

如果您希望在范围超出时自动释放堆分配,您也可以使用 auto_ptr。

于 2013-05-02T11:53:23.327 回答