2016-05-20 8 views
-1

Для назначения мне нужно уметь умножать введенные пользователем матрицы. Чтобы удерживать матрицы, я использую 2D arrays, их sizes, введенные пользователем. Я инициализировать размер и создать array следующим образом:Сбой сегментации C++ (дамп ядра) при использовании динамического 2D-массива

примечания, я пытаюсь использовать short, чтобы ограничить количество memory, используемое на значениях (тестовые значения не будут, вероятно, будут большими).

В файле source, constructor а (конструктор по умолчанию выглядит идентично, за исключением не parameters и rows/cols инициализируются в 1).

Заголовочный файл:

short int** value_array; 

Источник файла:

Matrix::Matrix(unsigned int x, unsigned int y) 
{ 
    rows = x; 
    cols = y; 
    value_array = NULL; 
    value_array = new short int*[rows]; 
    for (unsigned int i = 0; i < cols; i++) 
     value_array[i] = new short int[cols]; 
} 

В инициализирующий function:

void Matrix::init(unsigned int x, unsigned int y, short int value) 
{ 
    value_array[x][y] = value; 
    return; 
} 

destructor выглядит следующим образом:

Matrix::~Matrix() // destructor 
{ 
    for (unsigned int i = 0; i < rows; i++) 
     delete value_array[i]; 
    delete [] value_array; 
} 

В файле main.cpp только связанный с указателем code вызывает эти functions. value_array - private-variable.

core dump происходит либо при matrix инициализируется или (если он маленький), когда matrix содержащий продукт после умножения создается, что заставляет меня думать, что это где-то в коде создания.

Я использую Ubuntu 16.04, используя это в терминале с g++compiler.

+2

Опубликовать [MCVE] пожалуйста. Также пройдите через вашу программу с помощью отладчика, чтобы сузить источник вашей ошибки, прежде чем делать это. –

+1

BTW 'delete value_array [i];' должен быть 'delete [] value_array [i];' и код, который вы предоставляете, не является полным для вопроса, который вы задаете. –

+1

Почему бы вам не использовать контейнеры C++ для вас вместо '**' stuff? – 4386427

ответ

4

Ваша ошибка в цикле, который вы используете в конструкторе Matrix. Вы перебираете значение cols, а не rows.

Что происходит в том, что в вашем деструкторе Matrix вы перебираете строки во внутреннем цикле, и это приводит к вызову delete для строк, которые могут не существовать.

Live Example of Bug

Поэтому это:

for (unsigned int i = 0; i < cols; i++) 
    value_array[i] = new short int[cols]; 

Должно быть:

for (unsigned int i = 0; i < rows; i++) 
    value_array[i] = new short int[cols]; 

Кроме того, в вашем деструкторе, это:

delete value_array[i]; 

Должно быть:

delete [] value_array[i]; 
+0

Большое спасибо! Я предположил, что это что-то вроде этого, мне кажется, мне просто нужен дополнительный набор глаз. IOU one PaulMcKenzie – rtherman