Aオブジェクトを作成する2つのコードがあります
A* a=new A();
と
A b;
A *c=&b;
問題は、「オブジェクトは常にヒープに割り当てられる」と誰かが言うことです。
スタックで宣言しても本当ですか?(コード1)
注:実際のメモリ割り当てを参照しています。オブジェクト'b'が
スコープ外になるとクリアされます。しかし、それがまだ範囲内にある場合、どこで
'b'のメモリは実際に存在しますか?
Aオブジェクトを作成する2つのコードがあります
A* a=new A();
と
A b;
A *c=&b;
問題は、「オブジェクトは常にヒープに割り当てられる」と誰かが言うことです。
スタックで宣言しても本当ですか?(コード1)
注:実際のメモリ割り当てを参照しています。オブジェクト'b'が
スコープ外になるとクリアされます。しかし、それがまだ範囲内にある場合、どこで
'b'のメモリは実際に存在しますか?
ポインタa
はスタック上にあり、ポインタがA
指すインスタンスはヒープ上にあります。
オブジェクトb
はスタック上にあり、ポインターc
はスタック上にあります。
@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;
}
main
ます。文字列は定数であるため、他の文字列と一緒に静的データ空間に割り当てられます。static
キーワードは、スタックに割り当てられないことを示します。buf1
、スタック上にあり、malloc
関心のある戻り値があります。常に戻り値を確認する必要があります。一般的な経験則として:
あらゆる種類の動的メモリ割り当て(new、array new、mallocなど)を使用する場合、割り当てられたオブジェクトはヒープ上に配置されます。それ以外の場合は、スタックにプッシュされます。
2番目のスニペットで示したように、(スタックメモリを使用して)ローカルスコープでオブジェクトを作成することは間違いなく可能です。
最初のスニペットは、ヒープメモリを使用してオブジェクトAを作成します。
ケビン