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

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

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

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

解決済

c++ メモリの動的確保

fgfnabwym
fgfnabwym

総合スコア0

C++

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

2回答

0評価

0クリップ

2735閲覧

投稿2015/07/20 13:13

次のプログラムのメモリを動的に確保したいのですが、思うようにうまくいきません。

newとdeleteを使わず、静的にメモリを確保すると、プッシュもポップも上手くいきます。
しかし、newとdeleteを使うとプッシュは出来るのですが、ポップの時に格納した値が取り出されず、文字化けされたように値が取り出されます。

動的にメモリを確保する方法を教えて下さい。

c++

#include <iostream> #include <vector> using namespace std; #define SIZE 10 // 汎用stackクラスを作成する template <class StackType> class stack { StackType stck\[SIZE\]\[2\]; // スタックの領域を確保する int tos; // スタックの先頭を索引 public: void init\(\) { tos = 0; } // スタックを初期化する void push\(StackType ob, StackType ob2\); // スタックにオブジェクトをプッシュする StackType pop\(StackType &ob2\); // スタックにオブジェクトをポップする }; // オブジェクトをプッシュする template <class StackType> void stack<StackType>::push\(StackType ob, StackType ob2\) { /\* new \*/ // StackType\*の配列を動的生成 StackType \*\*stck = new StackType\*\[SIZE\]; // 配列の各要素でStackTypeの配列を動的生成 stck\[tos\] = new StackType\[2\]; if \(tos == SIZE\) { cout << "スタックは一杯です\\n"; return; } stck\[tos\]\[0\] = ob; cout << "stck\[" << tos << "\]\[0\]" << stck\[tos\]\[0\] << '\\n'; stck\[tos\]\[1\] = ob2; cout << "stck\[" << tos << "\]\[1\]" << stck\[tos\]\[1\] << '\\n'; cout << "tosの値\+前" << tos << '\\n'; tos\+\+; cout << "tosの値\+後" << tos << '\\n'; /\* delete \*/ // 各要素を先にdelete delete\[\] stck\[tos\]; stck\[tos\] = 0; delete\[\] stck; stck = 0; } // オブジェクトをポップする template <class StackType> StackType stack<StackType>::pop\(StackType &ob2\) { if \(tos == 0\) { cout << "スタックは空です\\n"; return 0; // スタックが空の場合はヌルを返す } cout << "tosの値-前" << tos << '\\n'; tos--; cout << "tosの値-後" << tos << '\\n'; ob2 = stck\[tos\]\[1\]; cout << "stck\[" << tos << "\]\[0\]" << stck\[tos\]\[0\] << '\\n'; cout << "stck\[" << tos << "\]\[1\]" << stck\[tos\]\[1\] << '\\n'; return stck\[tos\]\[0\]; } int main\(\) { // 文字スタックの動作を確認する stack<char> s1; // スタックを作成する int i; char ch; // スタックを初期化する s1\.init\(\); s1\.push\('a', 'm'\); s1\.push\('e', 'q'\); s1\.push\('q', 'p'\); cout << '\\n'; for \(i = 0;i < 3;i\+\+\) { cout << "s1をポップする:" << s1\.pop\(ch\) ; cout << ' ' << ch << '\\n'; } return 0; }

実行

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をポップする: ・

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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