#戻り値でポインタを含むオブジェクトを返したい
C++で行列クラスの作成をしています.いま,operatorを用いて行列同士の加算を+で定義しようとしたところ,コンパイルは通ったのですが,実行結果が正常に動作しませんでした.operatorの戻り値にポインタが含まれているため正常に動作しないということはわかったのですが,どのように訂正すれば良いかわかりません.どなたか教えてください...
C++
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4 5// 行列クラス 6class Matrix{ 7protected: 8 double *m_matrix; 9 int m_row; 10 int m_column; 11public: 12 Matrix(int R, int C); //行列のサイズを指定して零行列を作成 13 Matrix(int R, int C, double *V); //行列のサイズを指定して行列を作成 14 Matrix(Matrix &matrix); //引数に指定された行列と同じ値を持つ新しい行列を生成 15 ~Matrix(); //コンストラクタで確保した動的メモリを解放 16 int IsOK(); //行列が有効かどうか返す 17 void Show(); //格納されている行列を画面に表示する 18 Matrix operator+ (Matrix &mat1); //2つの行列を加算 19}; 20 21//行列のサイズを指定して零行列を作成 22Matrix::Matrix(int R, int C) : m_matrix(NULL) 23{ 24 if(R<1){ 25 fprintf(stderr,"行指定が不正です.\n"); 26 return ; 27 } 28 if(C<1){ 29 fprintf(stderr,"列指定が不正です.\n"); 30 return ; 31 } 32 33 m_row=R; 34 m_column=C; 35 m_matrix = new double [m_row*m_column]; 36 37 for(int i=0; i<m_row*m_column; i++){ 38 m_matrix[i]=0; 39 } 40 41} 42 43//行列のサイズを指定して行列を作成 44Matrix::Matrix(int R, int C, double *V) : Matrix(R, C) 45{ 46 if(m_matrix == NULL) return; 47 48 for (int i=0; i<R*C; i++){ 49 m_matrix[i]=V[i]; 50 } 51} 52//引数に指定された行列と同じ値を持つ新しい行列を生成(複製コンストラクタ) 53Matrix::Matrix(Matrix &matrix1):Matrix(matrix1.m_row,matrix1.m_column) 54{ 55 if (m_matrix == NULL) return; 56 if (matrix1.m_matrix == NULL) return ; 57 int N=matrix1.m_row*matrix1.m_column; 58 m_row=matrix1.m_row; 59 m_column=matrix1.m_column; 60 m_matrix=new double [N]; 61 for(int i=0; i<m_row*m_column; i++){ 62 m_matrix[i]=matrix1.m_matrix[i]; 63 } 64} 65//コンストラクタで確保した動的メモリを解放 66Matrix::~Matrix() 67{ 68 delete [] m_matrix; 69 m_matrix = NULL; 70} 71 72//行列がNULLかどうか返す 73//不正な計算が行われた際行列にNULLを代入している 74//行列がNULLの時画面表示しないようにIsOkをShow()関数内で呼び出す 75int Matrix::IsOK() 76{ 77 if (m_matrix == NULL) 78 return 0; 79 else 80 return 1; 81} 82//格納されている行列を画面に表示する 83//配列がNULLなら画面表示しないようにする 84void Matrix::Show() 85{ 86 if(IsOK() == 0){ 87 printf("ERROR\n"); 88 return; 89 } 90 for(int i=0; i<m_row; i++){ 91 printf("|"); 92 int j; 93 for(j=0; j<m_column; j++){ 94 printf("%6.2f",m_matrix[i*(m_column)+j]); 95 if(j<m_column-1) 96 printf(" "); 97 } 98 printf("|\n"); 99 } 100} 101 102 103//2つの行列を加算 104//エラー 105Matrix Matrix::operator+ (Matrix &mat1) 106{ 107 Matrix mat(m_row,m_column); 108 for(int i=0; i<m_row*m_column; i++){ 109 mat.m_matrix[i] = m_matrix[i]; 110 mat.m_matrix[i] += mat1.m_matrix[i]; 111 } 112 return mat; 113} 114 115int main() 116{ 117 double val1[]={1.0,2.0,3,0,4,0,5.0,6.0}; 118 Matrix mat1(2,3,val1); 119 printf("mat1=\n"); 120 mat1.Show(); 121 double val2[]={0.0,2.0,3.0,4,0,5.0,6.0}; 122 Matrix mat2(2,3,val2); 123 printf("mat2=\n"); 124 mat2.Show(); 125 Matrix mat3(mat1); 126 mat3=mat1+mat2; 127 printf("mat3=\n"); 128 mat1.Show(); 129}
実行結果:: mat1= | 1.00 2.00 3.00| | 0.00 4.00 0.00| mat2= | 0.00 2.00 3.00| | 4.00 0.00 5.00| mat3= | 1.00 2.00 3.00| | 0.00 4.00 0.00| *** Error in `': double free or corruption (fasttop): 0x000000000207bd20 *** ======= Backtrace: ========= ======= Memory map: ========
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/29 00:38
2018/12/29 07:20