私はC++を使い始めました。これまでのオブジェクト指向プログラミングの経験がないので、概念は難しいです。私は組み込みの配列とコンストラクタ/デストラクタを学習していますが、私は頭を抱くことができないというエラーが発生しました。ここでは、皆さんにコードを示します。コンストラクタが呼び出されず、 "解放中のポインタが割り当てられませんでした"エラー
クラス定義が
class arraysClass{
public:
int size1;
int size2;
int **frequencies;
arraysClass(int size1, int size2){
cout << "Constructor: size1&size2 " << size1 << " " << size2 << endl;
frequencies = new int*[size1+1];
for (int i=0; i<=size1; i++){
frequencies[i] = new int[size2+1];
}
}
//Destructor
~arraysClass()
{
cout << "Destructor: size1&size2 " << size1 << " " << size2 << endl;
for (int i=0; i<=size1; i++){
delete [] frequencies[i];
}
delete [] frequencies;
}
};
、ここでは結果が
コンストラクタであると私は何を得る私の主な機能
int main() { int size1 = 20; int size2 = 30; arraysClass arrays1(size1, size2); arraysClass arrays2 = arrays1; arrays2.size1 = size1; arrays2.size2 = size2; return 1; }
で行く:SIZE1 & size2に20 30
Destr uctor:SIZE1 & size2に20 30
デストラクタ:SIZE1 & size2に0
のa.out(41138,0x7fff75694000)はmalloc:***オブジェクト0x7fa2eac032d0のエラー:ポインタが解放され、割り当てられていなかった
変わったことは、クラスオブジェクトの2番目のインスタンスが明確に存在するときにコンストラクタが1回だけ呼び出されたことです。私はコピーコンストラクタを作ったり、演算子=関数をオーバーロードしたりしていないので、このような状況をどうすればいいかわかりません。
誰かが絶望的な大学生を助ける気に?ありがとう!
暗黙のコピーコンストラクタが呼び出され、2番目のインスタンスがコピーされたポインタを再度削除しようとしました。 –
また、 'for ... i <= size1'を使った' new int * [size1 + 1] 'は、C++の理想的なものではなく、コードの整合性がとれなくなります。実際、デストラクタで 'size1'に依存しているので、' size1'を変更するとクラッシュする可能性があります。すべてのクラスメンバーを非公開にし、 'size'値を不変にする必要があります。 – Dai
@πάνταῥεyourあなたのリードをありがとう。私はそのテーマについていくつかの検索をしましたが、コピーコンストラクタがどのように動作するかについてはあまりにもあいまいです。これは、 'array1'と' arrays2'の両方が同じオブジェクトを指していることを意味しますか?これは、暗黙のコピーコンストラクタがユーザ定義のクラスに対して行うことになっていますか?なぜ私はこのようなエラーメッセージが出るのか説明してくれるはずです。 – Byng