質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1610閲覧

コピーコンストラクタでエラーが生じて進まない

nanyakanya

総合スコア44

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/02 07:10

編集2020/08/02 08:07

やりたいこと

九九の計算をobj1の中の配列に格納して、obj2に深いコピー(コピーコンストラクタ)を用いてコピーする

困っていること

コピーコンストラクタのところでエラーが生じて進まない。
コピーコンストラクタをコメントアウトした場合はきちんと動作した。
コピーコンストラクタを呼び出すところ”kuku_array obj2 = obj1;”においてコピーコンストラクタの中身までは言っていることが確認できたが(yesの出力があった)for文に入ったところで止まってしまっている。
newで作成した2次元配列の開放の仕方が分からない。(今のやり方だと1次元のみな気がする)

エラーコード

exited segmentation fault

c++

1#include <iostream> // coutのため 2#include <iomanip> // setwのため 3using namespace std; 4 5 6class kuku_array { 7// write here... 8public: 9 int **n; 10 int i; 11 int j; 12 kuku_array(){//九九を格納する2次元配列を作成するコンストラクタ 13 n = new int*[20]; 14 for( int i = 0; i < 20; i++ ){ 15 n[i] = new int[20];//この時点では空だから、mainの方で値を入れる 16 } 17} 18 19 void kuku_in(int a,int b){ 20 n[a][b] = a*b; 21 } 22 23 kuku_array(const kuku_array &obj){//なぜ引数がポインタ型ののか??? 24cout << "yes" << endl; 25 for(i = 1; i < 10; i++){ 26 for(j = 1; j < 10; j++){ 27 n[i][j] = obj.n[i][j]; //引数の配列をコピー 28 } 29 cout << i << endl; 30 } 31 } 32 33 void kuku_show(){ 34 cout<<setw(2)<<"|"<<setw(3)<<1 <<setw(3)<<2 <<setw(3)<<3 <<setw(3)<<4 <<setw(3)<<5 <<setw(3)<<6 <<setw(3)<<7 <<setw(3)<<8 <<setw(3)<<9 <<endl; 35 36 // 横線の表示 37 cout<<"-------------------------------"<<endl; 38 39 40 // 九九本体の表示 41 42 for(i = 1; i < 10; i++){ 43 cout<<i<<"|"; 44 for(j = 1; j < 10; j++){ 45 cout<<setw(3)<<n[i][j]; 46 } 47 cout <<endl; 48 } 49 } 50 51 ~kuku_array(){ 52 cout << "Destructor is called." << endl; 53 delete[] n; 54 n = 0; 55 } 56 57}; 58 59int main() { 60 61 // 九九オブジェクトobj1の生成 62 // write here... 63 kuku_array obj1; 64 int i,j; 65cout << "Hello!" << endl; 66 67 68 // 九九を計算して、obj1の配列に入れる 69 // write here... 70 for( i = 0 ;i < 10 ; i++ ){ 71 for(j = 0 ; j < 10 ; j++ ){ 72 obj1.kuku_in(i,j); 73 } 74 cout << i << endl; 75 } 76 77 78 79 80 // 九九オブジェクトobj2にobj1の中身をコピーする 81 // write here... 82 obj1.kuku_show(); 83 84 kuku_array obj2 = obj1; //obj1の中身をobj2にコピーする 85 86 87 88 // obj2に保持されている九九を表示する 89 // write here... 90 obj2.kuku_show(); 91 92 93 94 return 0; 95} 96

実行結果

Hello!
0
1
2
3
4
5
6
7
8
9
| 1 2 3 4 5 6 7 8 9

1| 1 2 3 4 5 6 7 8 9
2| 2 4 6 8 10 12 14 16 18
3| 3 6 9 12 15 18 21 24 27
4| 4 8 12 16 20 24 28 32 36
5| 5 10 15 20 25 30 35 40 45
6| 6 12 18 24 30 36 42 48 54
7| 7 14 21 28 35 42 49 56 63
8| 8 16 24 32 40 48 56 64 72
9| 9 18 27 36 45 54 63 72 81
yes

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/08/02 07:43

エラーが出るならエラーメッセージを提示しましょう
nanyakanya

2020/08/02 07:47

exited segmentation fault です
guest

回答2

0

diff

1 kuku_array(const kuku_array &obj){//なぜ引数がポインタ型ののか??? 2 cout << "yes" << endl; 3+ kuku_array a; 4 for(i = 1; i < 10; i++){ 5 for(j = 1; j < 10; j++){ 6- n[i][j] = obj.n[i][j]; //引数の配列をコピー 7+ a.n[i][j] = obj.n[i][j]; //引数の配列をコピー 8 } 9 cout << i << endl; 10 } 11+ n = a.n; 12+ a.n = nullptr; 13 }

引数の obj はポインタではなく参照です。

デストラクタの delete[] も間違っていませんか?
new[] の回数と合いませんよ。

投稿2020/08/02 08:39

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanyakanya

2020/08/02 08:46

ご指摘ありがとうございます。 delite[]のことなのですが。2次元配列を開放するためにはnewの時のようにfor文で開放するものなのでしょうか?
kazuma-s

2020/08/02 09:41

new[] と同数の delete[] が必要です。 代入演算子も用意しないと、n だけのコピーとなって、代入先の元のデータはメモリリークし、 さらに代入元ののデータをデストラクタで二重に delete してしまいますよ。 メンバの i と j は必要ですか? メンバ関数のローカル変数にしたほうが良いでしょう。
guest

0

ベストアンサー

kuku_array(const kuku_array &obj)

コピーコンストラクタ↑で必要な領域を確保せぬままナカミをコピーしていますから。

投稿2020/08/02 08:32

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanyakanya

2020/08/02 08:44

領域の確保はコピーコンストラクタの中で行うものなのですね。 ありがとうございました。 うまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問