
C++でどこまでヒープに確保されるのかが分からなくなる場合があります。
特に、配列がある場合や、クラスを使う場合newしてインスタンス作って使用する場合と、
そうでない場合があり、どこまでヒープ領域に確保されているのか
分からなくなってしまっています。
(開発環境 Visual Studio 2013等)
Q1 クラス内の配列
class AA{
public:
int x;
int dat[10];
};
AA *a0 = new AA();
とする場合と
AA a1;
とする場合。
このとき、メンバ変数はそれぞれ、
a0->xはヒープ領域に確保
a1.xはスタック領域に確保
されるという理解で良いですか?
そして、配列a0->dat[0]等 もヒープ領域に確保されていますか?
Q2 クラス内にクラス
class BB{
int u,v;
AA aa;
};
BB *b0 = new BB();
とした場合、
b0がヒープに確保されるとして、
b0->aaはヒープに確保されており、
b0->aa.xやb0->aa.dat[0]等もヒープに確保されているという
ことで良いでしょうか?
Q3 確認方法
変数等がヒープかスタック領域のどちらに確保されたかは
どうやって見分けることができますか?
アドレスの値から判断できますか?
よろしくお願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
自動変数はスタックから、newした場合はヒープからなんでしょけど、実際は最適化されて全然違う動きしてることもありますよ。
デバッグモードとリリースモードでも、メモリの取り方は変わってきますよ。
参考までに
No.4
- 回答日時:
ヒープやスタックかの話をするときは機器とOSと開発環境を限定してもらわないと回答が難しいと思って下さい。
C/C++の規格外の話なので環境依存するとしか言えないのです。開発環境 Visual Studio をVisualStudioに限定し、OSをWindows、機器をx84/x64アーキテクチャと言うことでよろしいですか?
そうするとautoなローカル変数はスタック上であると考えてもらえば良いと思います。ただし、スタックサイズはビルド時に変更できるので多少の融通は効きます。が、普通はこんなことはしません。ギリギリまで使ったら安全マージンがなくなりますから。
ローカル変数的なクラスのインスタンスも同様です。
No.3
- 回答日時:
> a0->xはヒープ領域に確保
> a1.xはスタック領域に確保
分けて考えているのが混乱の元。
メンバ変数は、クラスの一部です。
クラスがどうやって確保されたかを考えれば、メンバ変数がどこに確保されいるか、すぐわかるのでは。
int a[5] ;
とは、 sizeof(int) * 5 分の一塊の領域を「int が5つの配列」として使うためのもの。
class AA{
public:
int x;
int dat[10];
};
というのは、 sizeof(int)の一塊の領域とsizeof(int)*10の一塊の領域を含む、全体でsizeof(AA)の一塊の領域を使うためのものです。
> AA *a0 = new AA();
は、自動変数用の領域にsizeof(AA*)の一塊の領域が確保され、変数a0 という名前でアクセスできるようになります。
その内容は、 new AA()でnew/delete用の領域に確保された(そしてコンストラクタで初期化された)領域へのポインタになります。
> AA a1;
は、自動変数用の領域に sizeof(AA)の一塊の領域が確保され、変数a1 という名前でアクセスできるようになります。
その内容は、(コンストラクタで初期化された)AAです。
> BB *b0 = new BB();
> とした場合、
> b0がヒープに確保される
ポインタの場合は混同しないようにしましょう。
変数b0 自体は、自動のポインタ変数です。
自動変数用の領域にsizeof(BB*)の一塊の領域が確保されています。
その内容が new BB()で確保した領域のアドレスになっているのです。
BB b1 ;
*b0=&b1 ;
とすれば、 b0は b1のアドレス(=自動変数用の領域)になります。
------------
スタック、ヒープというのは、実装方法の一つであって、C++で決められたものではありません。
http://www.uquest.co.jp/embedded/learning/lectur …
> ヒープメモリについては、mallocなどのメモリ割り当て関数が、
> 開発環境(コンパイラ)に付属する標準ライブラリでサポートされている場合もあるんだけど、
> ない場合は自分で作る必要がある。
とあるように、mallocが「ヒープ」を使うとは限りません。
また、スタックオーバーフローは、スタックを使い過ぎたときに出るものです。
ですが、Windowsのような余裕のあるシステムでは、そうそう出るものではありません。
・大きな配列やクラスを自動変数として宣言しない
・再帰関数の呼び出しの深さに注意して、深くなりすぎないようにする
というのに気をつければ、まず発生することはありません。
No.2
- 回答日時:
C++ の規格 (とりあえず手元にある 14882:1998) に出てくる「スタック」や「ヒープ」って
・例外処理における専門用語としての「stack unwinding」と関連用語
・std::stack や優先準位キューがらみ (<algorithm> の std::make_heap など)
しかないんだよね.
さて, あなたの使ってる「スタック」とか「ヒープ」ってのは, これのことでいい?
この回答への補足
プログラムのメモリ配置でいう、スタックメモリとヒープメモリのことです。
「newやmallocを使うとヒープに確保される」というときに使う、ヒープメモリのことです。
ここに解説されている通りの内容です。
http://www.uquest.co.jp/embedded/learning/lectur …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- Gmail GmailでのPOPメールの保存先はどこなのか 3 2022/06/09 02:06
- 事件・事故 海に沈んだヘリコプターから回収された遺体って、なんで引き上げた後で死亡確認になるの? 11 2023/04/18 17:36
- 確定申告 死亡保険金 を年金型式で受け取った場合の確定申告についての質問です! 【⠀死亡保険金を年金で受領した 1 2023/06/15 02:58
- 生物学 通常の染色体をA、異常な染色体をaとした時、 父がaaで母がAaだと保因者となる子が産まれる確率は何 3 2023/01/29 11:39
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- 保育士・幼稚園教諭 保育の課題で、みなさんに至急確認してもらいたいのですが、総合的指導とはなにか→1つの遊びを取り上げて 1 2023/08/28 21:30
- 保育士・幼稚園教諭 保育の課題で、みなさんに至急確認してもらいたいのですが、総合的指導とはなにか→1つの遊びを取り上げて 1 2023/08/28 21:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビットをローテートするプログ...
-
newしないオブジェクトについて
-
プログラムが途中で強制終了し...
-
DLLで同じメモリ領域を参照する...
-
allocってなんですか?
-
メモリマップドファイルを可変...
-
C言語 mallocとfreeについて
-
メモリ解放について
-
callocの処理速度
-
C++で、メンバもヒープに確保さ...
-
HEAP に関すること
-
mallocについて
-
写真のc言語の問題がa以外わか...
-
CreateFileMapping について
-
JVMヒープサイズ設定について
-
配列の添え字の最大数とは?
-
DLLのマルチスレッドの動作につ...
-
関数から配列を返すには?
-
C言語 配列の長さの上限
-
配列の問題
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
malloc呼び出し時のセグメンテ...
-
入れ子になった構造体について
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
Win32APIでのメモリ管理について
-
配列の添え字の最大数とは?
-
C++のnewで確保したメモリーの...
-
プログラムが途中で強制終了し...
-
C言語 mallocとfreeについて
-
win32APIのHeapAlloc()の使い方...
-
LoadLibraryでAccess Violation...
-
グローバル変数のサイズ
-
MFCのCStringについて
-
メモリ不足になってしまう。
-
ヒープの実際の限界値は?
おすすめ情報