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

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

ただいまの
回答率

90.53%

  • C++

    3430questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 383

neil

score 17

経験したこと

C++の初学者です。
配列を宣言する時に、

new double[n_visible]


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

疑問に思ったこと

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

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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

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

static int buf[100];


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

整数値が入っていたというのはどうゆう 
ことなのでしょうか?

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/25 23:42

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

    キャンセル

  • 2017/02/26 07:31

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

    キャンセル

+1

こんにちは。

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

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

#include <iostream>

int main()
{
    double *tmp=new double[10];

    std::cout << tmp[0] << "\n";

    return 0;
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/25 22:04

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

    キャンセル

  • 2017/02/25 22:06

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

    キャンセル

  • 2017/02/25 22:27

    > degubmodeで初期化する前の途中の値を見たところ、0となっていました。

    doubleやint型等の基本形については初期化しないと値が不定となることが許されている場合が多いのですが、お使いのコンパイラでは、もしかするとデバッグ・モード時は0クリアされているのかも知れません。

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

    不定値だった場合は0除算やオーバーフローが起こり例外になる可能性はあります。

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PHP PDOでMySQLの値を配列で表示

    前提・実現したいこと 配列で出力したいのです htmlの部分は表示しなくてもいいです。 発生している問題・エラーメッセージ ブラウザで確認するとエラーが出てしまいます

  • 解決済

    TableViewの中身がないときの表現

    JavaFXのTableViewでまだ何もデータを表示していないときに TableViewのど真ん中に「表には中身がありません」と表示されますが、 この文言を他の言葉に変更した

  • 受付中

    【C#】Linqを使ってのXMLファイルの作成方法

    Linqを使ってのXMLファイルの作成方法についての質問です。 <Datas> <Data>

  • 解決済

    Java クラスの追加方法について(テトリス)

    Javaでテトリスの実装をさせているのですが機能として次にくるブロックを表示させる機能追加をしようとしていて別途でnextblockpaenlを作成したのですが(コード2)、コード

  • 解決済

    C# / List<string[]>への要素の追加

    実現したいこと C#の質問です。 List<string[]>での要素の追加についてお教え願います。 下記のようにListにおいてデータ列の挿入を行いたいのです。 For文で書

  • 受付中

    xamarin.androidにて任意の言語ファイルからテキストを取得する方法

    こんにちは。 xamarin.androidにおいて下記コードで現在使用中の言語のファイルを取得できますが、任意の言語のStrings.xml内のデータを取得することは可能でし

  • 解決済

    Javaでjsonを作成する方法

    javaのJsonライブラリ「jackson」を使用して、jsonを作成して処理を行いたいメソッドの引数に渡すことはできますか。初心者なので、間違いがおおいと思いますがよろしくお願

  • 受付中

    java.util.Scannerで入力した値を変数lineに格納する方法

    java初心者です。 java.util.Scannerで入力した値を変数lineに格納する方法がわかりません。 また、Stringクラスのメソッドを使用し、格納した値を","

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

  • C++

    3430questions

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