2016-05-20 5 views
-1

割り当てのために、入力された行列を乗算する必要があります。行列を保持するために、私は2D arraysを使用しています。ユーザが入力したsizesです。私は(テスト値はそう大きくはない)の値に使用さmemoryの量を制限するためにshortを使用しようとしている、動的2D配列使用時のC++セグメンテーションフォールト(コアダンプ)

注:私はサイズを初期化し、次のようにarrayを作成します。 sourceファイルで

constructor(デフォルトコンストラクタがありません parametersrows/cols 1に初期化されている以外は同一に見えます)。

ヘッダーファイル:

short int** value_array; 

ソースファイル:初期化function

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

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

destructorは次のようになります。

main.cppファイルでは、ポインタ関連のcodeのみがfunctionsを呼び出しています。 value_arrayprivate-variableです。

core dumpが起こるのいずれか(それは小さなだ場合)matrixは、乗算後の生成物を含むmatrixが、私はそれが作成コードのどこかだと思うにつながる、作成されたときに初期化したりしているとき。

私はg++compilerと端末でこれを実行して、Ubuntu 16.04を使用しています。

+2

投稿する[MCVE]してください。デバッガを使用してプログラムをステップ実行し、エラーの原因を絞り込みます。 –

+1

BTW 'delete value_array [i];'は 'delete [] value_array [i];'とされ、指定したコードはあなたが求めている質問に対して完全ではありません。 –

+1

なぜ、コンテナを使用しないのですか?C++は '**'ものの代わりにあなたを提供していますか? – 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ワンPaulMcKenzie – rtherman

関連する問題