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

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

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

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

Q&A

解決済

1回答

5250閲覧

c++ 動的確保がうまくいかない

fgfnabwym

総合スコア78

C++

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

0グッド

0クリップ

投稿2015/07/20 16:56

先ほども別に質問をし回答をいただいたのですが、その後の直しがうまくいきません。
汎用クラスを使い動的にメモリを確保したいのですが、解放の仕方が出来ません。
★で囲まれた部分をそのままコンパイルすると、char型クラスのオブジェクトを作成した際に下にあるようにエラーが起きます。
ans11n4.cpp:78: instantiated from here
ans11n4.cpp:29: error: incompatible types in assignment of ‘long int’ to ‘char [2]’
ans11n4.cpp:31: error: incompatible types in assignment of ‘long int’ to ‘char [10][2]’
char型にint型の0を代入しようとしているからエラーが出るのは分かりました。

★で囲まれた部分を消してコンパイルすると、コンパイルは通りますが、実行後デストラクタが呼ばれた後にSegmentation fault (core dumped)となります。

解決方法を教えていただけないでしょうか。

c++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5#define SIZE 10 6 7// 汎用stackクラスを作成する 8template <class StackType> class stack { 9 StackType stck[SIZE][2]; // スタックの領域を確保する 10 int tos; // スタックの先頭を索引 11public: 12 stack() // コンストラクタ 13 { 14 /* new */ 15 // StackType*の配列を動的生成 16 StackType **stck = new StackType*[SIZE]; 17 // 配列の各要素でStackTypeの配列を動的生成 18 stck[tos] = new StackType[2]; 19 } 20 ~stack() // デストラクタ 21 { 22cout << "デストラクタが呼ばれた\n"; 23 /* delete */ 24 // 各要素を先にdelete 25 delete[] stck[tos]; 26 ★stck[tos] = NULL;27 delete[] stck; 28 ★stck = NULL;29 } 30 void init() { tos = 0; } // スタックを初期化する 31 void push(StackType ob, StackType ob2); // スタックにオブジェクトをプッシュする 32 StackType pop(StackType &ob2); // スタックにオブジェクトをポップする 33}; 34 35

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

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

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

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

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

guest

回答1

0

ベストアンサー

コンストラクタで、クラスメンバの変数「stck」を初期化せずに、
同盟のローカル変数「stck」を新たに定義し、それを初期化してますね。

デストラクタでは、クラスメンバの「stck」変数を扱うので、
今回のようなエラーが出ます。

C++

1template <class StackType> class stack { 2 //StackType stck[SIZE][2]; // スタックの領域を確保する 3 StackType **stck; 4 int tos; // スタックの先頭を索引 5public: 6 stack() // コンストラクタ 7 { 8 /* new */ 9 // StackType*の配列を動的生成 10 //StackType **stck = new StackType*[SIZE]; 11 // ↑変数の前にStackTypeがあると、ローカル変数として扱われ、 12 // メンバ変数に格納されない。 13 stck = new StackType*[SIZE]; 14 // 配列の各要素でStackTypeの配列を動的生成 15 //stck[tos] = new StackType[2]; 16 // ↑ init()関数を呼び出していないのでtosの値は不定値 17 for (i = 0; i < SIZE; i++) { 18 stck[i] = new StackType[2]; 19 } 20 } 21 ~stack() // デストラクタ 22 { 23cout << "デストラクタが呼ばれた\n"; 24 /* delete */ 25 // 各要素を先にdelete 26 //delete[] stck[tos]; 27 //★stck[tos] = NULL;★ 28 // ↑init()呼ばれていない場合はtosは不定値 29 for (i = 0; i < SIZE; i++) { 30 if (stck[i] != NULL){ 31 delete[] stck[i]; 32 stck[i] = NULL; 33 } 34 } 35 delete[] stck; 36 ★stck = NULL;37 } 38 void init() { tos = 0; } // スタックを初期化する 39 void push(StackType ob, StackType ob2); // スタックにオブジェクトをプッシュする 40 StackType pop(StackType &ob2); // スタックにオブジェクトをポップする 41};

投稿2015/07/20 21:08

horohoro

総合スコア490

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

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

fgfnabwym

2015/07/21 12:08

horohoroさん、回答ありがとうございました。 ローカル変数や、stck変数などを理解できていませんでした。 コンストラクタで、クラスメンバの変数「stck」を初期化せずに、 同盟のローカル変数「stck」を新たに定義し、それを初期化してますね。 という言葉には驚きで今まで考えたこともなかったというか。名前が同じなら同じものだと思っていました。 これからは気を付けたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問