7

関数内のようにc++で変数をインスタンス化するとint x(つまり、xはローカル変数です)、プロセスのスタックの最上位に割り当てられます。しかし、int *x= new intそうすると、スペースはヒープで提供されます。

だから、私の質問は次のとおりです。

  1. 異なるクラス(c ++によって提供されるクラスまたはユーザー定義のクラス)のオブジェクトはどうですか?それらのオブジェクトはどこでインスタンス化されますか?例:Employeeをクラスとし、を宣言しEmployee emp;ます。empスペース->スタックまたはヒープのどこにスペースが与えられますか?

  2. 宣言int a[4]が関数内にある場合、の4つのセルすべてがaスタックにスペースを取得しますか?

4

5 に答える 5

11

すべてのローカル変数は、from クラスの組み込み型からのものであるか、配列であるかに関係なく、スタック上にあります。すべての動的割り当てはヒープ上にあります。

もちろん、staticローカル変数のような修飾子は、変数を別の場所に配置するため、関数呼び出し間で保持されます。

また、さらに混乱させるために、ローカルポインター変数を作成し、動的に割り当てられたオブジェクトを指すようにします。

Class* a = new Class;

実際の変数aはスタックにありますが、それが指すメモリはヒープにあります。


補遺: C++ 仕様では、実際にはスタックやヒープについては何も言及されておらず、さまざまな種類の変数の動作のみが言及されています。

于 2013-02-06T08:19:30.670 に答える
7

ノーマルタイプと全く同じです。

Class a; //stack. Usage: a.somethingInsideOfTheObject
Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject

クラス自体がヒープ上に何かを割り当てている場合、その部分は常にヒープ上にあることに注意してください。次に例を示します。

class MyClass
{
public:
    MyClass()
    {
        a = new int();
    }
private:
    int * a;
};

void foo()
{
    MyClass bar;
}

この場合、bar変数はスタックに割り当てられますが、そのa内部はヒープに割り当てられます。

于 2013-02-06T08:18:14.153 に答える
4
  1. 場合によります。Employeeスタックにのみ割り当てられるメンバーがある場合、オブジェクト全体が割り当てられます。しかし、Employeeポインターメンバーを持つことができ、Employeeのコンストラクターはヒープ上でそれらにメモリを割り当てることができます。次に、一部のメンバーはヒープ上にあり、一部はスタック上にあります。

  2. はい。

于 2013-02-06T08:19:38.880 に答える
3

ユーザー定義のクラス (および型) は、組み込み型と同じです。そう

Employee emp; // allocated in stack
Employee* emp = new Employee(); // allocated in heap

2番目の質問については、ローカル配列がスタックに割り当てられています

Employee emp[4]; // 4 instances on stack
于 2013-02-06T08:21:14.373 に答える
1

一般に、コンパイラがコンパイル時にそれ (つまりローカル変数) を認識している場合、それはスタックにあります。
コンパイラがコンパイル時にそれを認識しない場合 (つまりnewmallocなどによる動的割り当て)、それはヒープ上にあります。

この投稿には詳細な説明があります: global-memory-management-in-c-in-stack-or-heap

于 2013-02-06T08:23:48.497 に答える