English 中文(简体)
当我尝试分配一个4D数组时,为什么会出现分段错误(核心转储)?
原标题:
  • 时间:2009-03-12 06:25:59
  •  标签:

我正在尝试动态地分配一个大的4D矩阵。当我创建静态矩阵时,一切都正常,所以我知道现在我有足够的内存。但是,当我尝试动态实现相同的内容时,每当我进入第三个维度时都会出现问题,而我需要进入第四个维度!有人可以告诉我为什么这段代码不起作用吗?

#include <iostream>

using namespace std;

static const int time1 = 7;
static const int tlat = 15;
static const int tlon = 17;
static const int outlev = 3;  

int main(void)
{
    //allocate four dimensional dataIn
    int ****dataIn;
    dataIn = new int ***[time1];
    if (dataIn == NULL) { return 1; }

    for(int i = 0 ; i < time1 ; i++) { 
        dataIn[i] = new int **[tlat];
        if (dataIn[i] == NULL) { return 1; }

        for(int j = 0 ; j < tlat ; j++) {
            dataIn[i][j] = new int *[tlon];
            if (dataIn[i][j] == NULL) { return 1; }

            for(int k = 0 ; k < tlon ; k++) {
                dataIn[i][j][k] = new int[outlev];
                if (dataIn[i][j][k] == NULL) { return 1; }
            }
        }
    }
    //there is more code that happens here to add values to dataIn
    //and eventually output it but I know all of that works        
    return 0;
}

我已经尝试了许多不同的代码变体,甚至使用了 malloc 而不是 new,但我无法使其正常工作。任何帮助都将不胜感激。

问题回答

你在调试器中运行过这个吗?在我看来代码很好,但调试器会告诉你它在哪里崩溃,这可能足以帮助你解决它。

你最好把所有的内存分配到一个平坦的数组中,然后自己计算索引。将整个过程封装在一个对象中。

class Matrix {
private:
        int* data;        
        int[] sizes;
        int nDimensions;

public:
        // allocates the data pointer and copies the other parameters
        Matrix(int[] sizes, int nDimensions); 

        // frees the data and sizes arrays
        ~Matrix();

        // calculates the cell position and returns it
        int getCell(int[] coordinates);

        // calcultes the cell position and sets its value
        void setCell(int[] coordinates, int value);

private:
        // used by getCell and setCell, calculates the cell s 
        // location in the data array
        size_t calculateCellPosition(int[] coordinates);
};

它在我的Linux机器上可以编译并且运行良好。

顺便说一下,在标准C++中,当无法分配内存时,new会抛出std::bad_alloc异常(而不是返回NULL)。因此,捕获该异常可能比测试NULL指针更有价值。

正如cmeerw所指出的,不需要在std-c++中对NULL或0进行测试。

如果您能在发生“段错误”的确切位置添加注释,那将会有所帮助。

还有:你在使用哪个编译器和哪个操作系统?

看看boost::multiarray,它完全符合您的要求,但只需进行一次堆分配即可更加有效。





相关问题
热门标签