行列のクラスを書くように頼まれましたが、これまでのところ、次のようなものがあります。
ただし、「次のメンバー関数を実装する必要があります:パラメーター化されたコンストラクター(newを使用)およびデストラクタ(deleteを使用)」
それが何を意味するのかよくわかりませんが、私はそれをやったと思います。問題は、65行目のコメントを外すと、これまでに見たことのない奇妙なランタイムエラーが発生することです。私が間違っていることについて何か考えはありますか?ありがとう:)
編集:誰が私の質問に反対票を投じましたか、そしてその理由は何ですか?
また、私は追加しました:
matrix(matrix &m) {
// Copy size and declare new array
mdata=0; size=(m.getcols()*m.getrows());
if(size>0) {
mdata=new double[size];
// Copy values into new array
for(int i=0;i<size;i++) {
mdata[i] = m.mdata[i];
}
}
}
そして
delete [] mdata;
エラーがなくなったので、IlyaKobelevskiyとaruisdanteに回答していただきありがとうございます。
コピーコンストラクターを実装しなかったため、乗算関数から値を返すときにデフォルトのコンストラクターが呼び出されます。
デフォルトのコンストラクターは、メンバーをバイト単位でコピーするだけなので、同じメモリブロックを指すmdataを含む2つの行列ができあがります。2番目の行列のデストラクタが呼び出されると、すでに解放されているメモリを解放しようとしているため、エラーが発生します。
もちろん、それに加えて、他の人が削除[]について指摘したこともあります。
一般に、3つのルールに従う必要があります。あなたのケースに適用すると、デストラクタで重要なことを行う場合は、代入演算子とコピーコンストラクタを明示的に実装するか、プライベートとして宣言して実装しないで、コンパイラによって生成される自動化を回避し、クラスをコピーできないようにする必要があります。 。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加