2016-05-20 22 views
-1

Für eine Zuweisung muss ich in der Lage sein, vom Benutzer eingegebene Matrizen zu multiplizieren. Um die Matrizen zu halten, verwende ich 2D arrays, deren sizes vom Benutzer eingegeben wird. Ich initialisieren die Größe und erstellen Sie die array wie folgt:C++ Segmentierungsfehler (Kernspeicherauszug) bei Verwendung eines dynamischen 2D-Arrays

Anmerkung, ich versuche short zu verwenden, um die Menge an memory auf den Werten (Prüfwerte werden wahrscheinlich nicht groß) verwendet zu begrenzen.

In der source Datei, ein constructor (der Standard-Konstruktor sieht identisch mit Ausnahme ohne parameters und rows/cols werden 1 initialisiert).

Header-Datei:

short int** value_array; 

Quelldatei:

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]; 
} 

In der Initialisierung function:

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

Die destructor sieht wie folgt aus:

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

In der main.cpp Datei, die nur Zeiger bezogene code wird diese functions aufrufen. Die value_array ist eine private-variable.

Die core dump geschieht entweder, wenn die matrix initialisiert wird oder (wenn es klein ist), wenn die matrix das Produkt nach der Multiplikation enthält, erzeugt wird, was dazu führt, mich ist es irgendwo in der Schaffung Code zu denken.

Ich verwende Ubuntu 16.04, läuft dies in Terminal mit der g++compiler.

+2

Veröffentlichen Sie bitte ein [MCVE]. Durchlaufen Sie auch Ihr Programm mit dem Debugger, um die Quelle Ihres Fehlers einzuschränken, bevor Sie dies tun. –

+1

BTW 'delete value_array [i];' soll 'delete [] value_array [i];' sein und der von Ihnen angegebene Code ist nicht vollständig für die Frage, die Sie stellen möchten. –

+1

Warum nicht die Container verwenden, die C++ für Sie bereithält, statt '**' Zeug? – 4386427

Antwort

4

Ihr Fehler befindet sich in der Schleife, die Sie in dem Matrix-Konstruktor verwenden. Sie durchlaufen den Wert cols und nicht rows.

Was passiert, ist, dass in Ihrem Matrix Destruktor, Sie über die Zeilen in der inneren Schleife Schleife, und dies führt zu Aufruf delete auf Zeilen, die möglicherweise nicht vorhanden sind.

Live Example of Bug

Deshalb ist diese:

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

Sollte sein:

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

Zusätzlich in Ihrem destructor, dies:

delete value_array[i]; 

werden sollten:

delete [] value_array[i]; 
+0

Vielen Dank! Ich dachte irgendwie, dass es so etwas ist, ich denke ich brauchte nur extra Augen. IOU ein Paul McKenzie – rtherman