-1

Aオブジェクトを作成する2つのコードがあります

A* a=new A();

A b; 
A *c=&b;

問題は、「オブジェクトは常にヒープに割り当てられる」と誰かが言うことです。

スタックで宣言しても本当ですか?(コード1)

注:実際のメモリ割り当てを参照しています。オブジェクト'b'が

スコープ外になるとクリアされます。しかし、それがまだ範囲内にある場合、どこで

'b'のメモリは実際に存在しますか?

4

4 に答える 4

2

ポインタaはスタック上にあり、ポインタがA指すインスタンスはヒープ上にあります。

オブジェクトbはスタック上にあり、ポインターcはスタック上にあります。

于 2013-03-16T19:13:05.317 に答える
1

@LouisTanこれらのコード行がプログラムのどこにあるかによって異なります。しかし、一般的に、このポインターはスタック上にあります。

これを比較してください:

/* my.c */

char * str = "Your dog has fleas.";  /* 1 */
char * buf0 ;                         /* 2 */

int main(){
    char * str2 = "Don't make fun of my dog." ;  /* 3 */
    static char * str3 = str;         /* 4 */
    char * buf1 ;                     /* 5 */
    buf0 = malloc(BUFSIZ);            /* 6 */
    buf1 = malloc(BUFSIZ);            /* 7 */

    return 0;
}
  1. これは、スタックにもヒープにも割り当てられません。代わりに、静的データとして割り当てられ、ほとんどの最新のマシンでは独自のメモリセグメントに配置されます。実際の文字列も静的データとして割り当てられ、適切なマシンの読み取り専用セグメントに配置されます。
  2. 単に静的に割り当てられたポインタです。静的データの1つのアドレス用のスペース。
  3. ポインタがスタックに割り当てられており、戻ったときに効果的に割り当てが解除されmainます。文字列は定数であるため、他の文字列と一緒に静的データ空間に割り当てられます。
  4. は実際には2とまったく同じように割り当てられます。staticキーワードは、スタックに割り当てられないことを示します。
  5. ...しかしbuf1、スタック上にあり、
  6. ...mallocされたバッファスペースはヒープ上にあります。
  7. ちなみに、子供たちは家でこれを試しません。 malloc関心のある戻り値があります。常に戻り値を確認する必要があります。

チャーリー・マーティンの投稿全文はこちらをご覧ください

于 2013-03-16T19:18:01.087 に答える
1

一般的な経験則として:

あらゆる種類の動的メモリ割り当て(new、array new、mallocなど)を使用する場合、割り当てられたオブジェクトはヒープ上に配置されます。それ以外の場合は、スタックにプッシュされます。

于 2013-03-16T19:15:24.677 に答える
0

2番目のスニペットで示したように、(スタックメモリを使用して)ローカルスコープでオブジェクトを作成することは間違いなく可能です。
最初のスニペットは、ヒープメモリを使用してオブジェクトAを作成します。

ケビン

于 2013-03-16T19:15:58.777 に答える