次のプログラムのメモリを動的に確保したいのですが、思うようにうまくいきません。
newとdeleteを使わず、静的にメモリを確保すると、プッシュもポップも上手くいきます。
しかし、newとdeleteを使うとプッシュは出来るのですが、ポップの時に格納した値が取り出されず、文字化けされたように値が取り出されます。
動的にメモリを確保する方法を教えて下さい。
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 void init() { tos = 0; } // スタックを初期化する 13 void push(StackType ob, StackType ob2); // スタックにオブジェクトをプッシュする 14 StackType pop(StackType &ob2); // スタックにオブジェクトをポップする 15}; 16 17// オブジェクトをプッシュする 18template <class StackType> 19void stack<StackType>::push(StackType ob, StackType ob2) 20{ 21 /* new */ 22 // StackType*の配列を動的生成 23 StackType **stck = new StackType*[SIZE]; 24 // 配列の各要素でStackTypeの配列を動的生成 25 stck[tos] = new StackType[2]; 26 27 if (tos == SIZE) { 28 cout << "スタックは一杯です\n"; 29 return; 30 } 31 stck[tos][0] = ob; 32cout << "stck[" << tos << "][0]" << stck[tos][0] << '\n'; 33 stck[tos][1] = ob2; 34cout << "stck[" << tos << "][1]" << stck[tos][1] << '\n'; 35cout << "tosの値+前" << tos << '\n'; 36 tos++; 37cout << "tosの値+後" << tos << '\n'; 38 /* delete */ 39 // 各要素を先にdelete 40 delete[] stck[tos]; 41 stck[tos] = 0; 42 delete[] stck; 43 stck = 0; 44} 45 46// オブジェクトをポップする 47template <class StackType> 48StackType stack<StackType>::pop(StackType &ob2) 49{ 50 51 if (tos == 0) { 52 cout << "スタックは空です\n"; 53 return 0; // スタックが空の場合はヌルを返す 54 } 55 56cout << "tosの値-前" << tos << '\n'; 57 tos--; 58cout << "tosの値-後" << tos << '\n'; 59 ob2 = stck[tos][1]; 60cout << "stck[" << tos << "][0]" << stck[tos][0] << '\n'; 61cout << "stck[" << tos << "][1]" << stck[tos][1] << '\n'; 62 return stck[tos][0]; 63 64} 65 66int main() 67{ 68 // 文字スタックの動作を確認する 69 stack<char> s1; // スタックを作成する 70 int i; 71 char ch; 72 73 // スタックを初期化する 74 s1.init(); 75 s1.push('a', 'm'); 76 s1.push('e', 'q'); 77 s1.push('q', 'p'); 78 79cout << '\n'; 80 for (i = 0;i < 3;i++) { 81 cout << "s1をポップする:" << s1.pop(ch) ; 82 cout << ' ' << ch << '\n'; 83 } 84 return 0; 85} 86
実行
stck[0][0]a stck[0][1]m tosの値+前0 tosの値+後1 stck[1][0]e stck[1][1]q tosの値+前1 tosの値+後2 stck[2][0]q stck[2][1]p tosの値+前2 tosの値+後3 tosの値-前3 tosの値-後2 stck[2][0]6 stck[2][1] s1をポップする:6 tosの値-前2 tosの値-後1 stck[1][0] stck[1][1] s1をポップする: tosの値-前1 tosの値-後0 stck[0][0] stck[0][1]・ s1をポップする: ・
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/20 14:08