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

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

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

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

Q&A

解決済

3回答

1752閲覧

C++のnew に関して疑問に思ったことがあります。

neil

総合スコア25

C++

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

0グッド

1クリップ

投稿2017/02/25 11:46

###経験したこと
C++の初学者です。
配列を宣言する時に、

new double[n_visible]

などのようにしてあるメモリー領域を確保する
ということは理解しているのですが、
gdbを使って
その確保した領域の値を見ていると
0であったり1342177280であったり1であったり
しました。確保した領域の外の領域の値を見たところ、
0となっていました。

###疑問に思ったこと
初期化していない領域ではNULLなどがあるかと
思ったのですが、整数値が入っていたというのはどうゆう
ことなのでしょうか?
これは私の推察なのですが、初期化していない領域は0の値を
保持し、以前に使われた領域はその時に保持していた値を
保持し続けるということなのでしょうか?

基本的な内容だと思うのですが、
気になったので質問させていただきました。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず、C/C++に関しては、処理効率を優先するために、明確に決まっていること以外、処理系依存であることを理解して下さい。sizeof(int)も処理系によって異なります。

未確保領域も、確保後未初期化領域も、その内容は不定、すなわち処理系依存です。ただ、未初期化静的領域、例えば

C++

1static int buf[100];

は、0に初期化されている処理系が多いです。

整数値が入っていたというのはどうゆう

ことなのでしょうか?

あるメモリ領域を整数とみなすか浮動小数点とみなすかは、コンパイラやデバッガの勝手です。
ただ、浮動小数点も符号部、仮数部、指数部の三つの整数値によって構成されています。デバッガで整数値とみなせば、整数値になります。

doubleがIEEE方式ならば(ほとんどの処理系でそうですが)、doubleの0.0は、8バイトの0の連続です。

以前に使われた領域はその時に保持していた値を

保持し続ける

そのような処理系が多いです。メモリは書き込まれない限りその値を保持し続けます(volatile宣言しなければならない場合はそうとは限らない)。
メモリ解放時にその領域に対して何もせず、その領域が再び確保されるときにも何もしなければ、結果的にそういうことになります。

ただし、ある処理系で、処理効率が問題にならないデバッグモードでコンパイルされると、メモリ解放時にその領域を0xFEEEFEEEで埋めて、解放(free)されたことを示し、デバッグし易くしてくれる場合があります。

投稿2017/02/25 13:48

naomi3

総合スコア1105

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

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

raccy

2017/02/25 14:42

staticな変数が0で初期化されるのは処理系依存では無くて言語仕様では無いのでしょうか?
naomi3

2017/02/25 22:31

失礼しました。raccyさんのおっしゃる通り、初期化式なしで静的に確保された変数は、言語仕様により、0(数値型の場合)かNULLポインタ(ポインタ型の場合)に初期化されます。
guest

0

初期化していない領域ではNULLなどがあるかと
思ったのですが、整数値が入っていたというのはどうゆう
ことなのでしょうか?
これは私の推察なのですが、初期化していない領域は0の値を
保持し、以前に使われた領域はその時に保持していた値を
保持し続けるということなのでしょうか?

そうですね。この場合はメモリを確保して何もしていないということです。
初期化が発生しない場合は、確保する前に書き込まれたデータが残っています。

投稿2017/02/25 13:40

hmmm

総合スコア818

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

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

0

こんにちは。

gdbを使って その確保した領域の値を見ていると

その時見たのはどの値でしょうか?
0や1や0x50000000になるケースはちょっと思いつきません。

C++

1#include <iostream> 2 3int main() 4{ 5 double *tmp=new double[10]; 6 7 std::cout << tmp[0] << "\n"; 8 9 return 0; 10}

のようなことをしたらどうなりますか?
MinGWとmsvcでは2.96235e-304などのデタラメな値(不定値)が表示されました。

投稿2017/02/25 12:45

Chironian

総合スコア23272

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

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

neil

2017/02/25 13:04

回答ありがとうございます。 上記のコードを実行したところ、 debug modeなしで実行したところ -1.72723e-77や0などのような値がランダムに出てきました。 degubmodeで初期化する前の途中の値を見たところ、 0となっていました。
neil

2017/02/25 13:06

ちなみになのですが、初期化を行う 前に配列を用いて計算などをしてしまうと、 exceptionになるような設計にC++はなっていますか?
Chironian

2017/02/25 13:27

> degubmodeで初期化する前の途中の値を見たところ、0となっていました。 doubleやint型等の基本形については初期化しないと値が不定となることが許されている場合が多いのですが、お使いのコンパイラでは、もしかするとデバッグ・モード時は0クリアされているのかも知れません。 > 初期化を行う前に配列を用いて計算などをしてしまうと、exceptionになるような設計にC++はなっていますか? 不定値だった場合は0除算やオーバーフローが起こり例外になる可能性はあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問