Почему я получаю ошибку сегментации (дамп ядра), когда пытаюсь выделить 4D массив? - PullRequest
0 голосов
/ 12 марта 2009

Я пытаюсь выделить большую 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, но я не могу заставить его работать. Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

2 голосов
/ 12 марта 2009

Вам, вероятно, лучше всего выделить всю память в виде плоского массива, а затем самостоятельно рассчитать индексы. Заворачивание всего объекта в объект для инкапсуляции.

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);
};
2 голосов
/ 12 марта 2009

Вы запускали это в отладчике? На мой взгляд, код выглядит хорошо, но отладчик скажет вам, где происходит сбой, и этого может быть достаточно, чтобы помочь исправить это

1 голос
/ 12 марта 2009

Он компилируется и отлично работает на моей машине с Linux.

Кстати, со стандартным C ++ new выдает исключение std :: bad_alloc (вместо возврата NULL), когда не удается выделить память. Так что, возможно, стоило бы перехватить это исключение вместо проверки на NULL-указатель.

0 голосов
/ 12 марта 2009

Извлеките boost :: multiarray , он делает именно то, что вам нужно, за исключением более эффективного выполнения только одного выделения кучи.

0 голосов
/ 12 марта 2009

Как указывает cmeerw, тестирование на NULL или 0 в std-c ++ не требуется.

Было бы полезно, если бы вы могли добавить комментарий к точному месту, где вы получаете сегв.

Также: Какой компилятор вы используете и на какой ОС?

...