多维数组的运行时分配

时间:2010-07-31 04:06:04

标签: multidimensional-array dynamic-memory-allocation new-operator

到目前为止,我认为以下语法无效,

int B[ydim][xdim];

但是今天我尝试了它的确有效!我运行了很多次以确保它不会偶然发挥作用,即使valgrind也没有报告任何段错误内存泄漏 !!我很惊讶。它是g ++中引入的新功能吗?我总是使用1D数组来存储矩阵,方法是使用正确的步幅对它们进行索引,如下面的程序中的A所示。但是这个新方法,和B一样,是如此简单和优雅,我一直想要。使用真的安全吗?请参阅示例程序。

PS。我正在用g ++ - 4.4.3编译它,如果这很重要的话。

#include <cstdlib>
#include <iostream>

int test(int ydim, int xdim) {
// Allocate 1D array
    int *A = new int[xdim*ydim](); // with C++ new operator
    // int *A = (int *) malloc(xdim*ydim * sizeof(int)); // or with C style malloc
    if (A == NULL)
        return EXIT_FAILURE;

// Declare a 2D array of variable size
    int B[ydim][xdim];

// populate matrices A and B
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++) {
            A[y*xdim + x] = y*xdim + x;
            B[y][x] = y*xdim + x;
        }
    }

// read out matrix A
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++)
            std::cout << A[y*xdim + x] << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;

// read out matrix B
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++)
            std::cout << B[y][x] << " ";
        std::cout << std::endl;
    }

    delete []A;
    // free(A); // or in C style
    return EXIT_SUCCESS;
}


int main() {
    return test(5, 8);
}

2 个答案:

答案 0 :(得分:1)

这是C99'可变长度数组'或VLA。如果它们也受到g ++的支持,那么我相信它是C ++标准的扩展。

很好,不是吗?

答案 1 :(得分:1)

int b[ydim][xdim]在堆栈上声明了一个二维数组 。另一方面,new在堆上分配数组

对于任何非平凡的数组大小,将它放在堆上几乎肯定更好,以免你自己跑出堆栈空间,或者如果你想将数组传递回当前范围之外的东西。