(C++ の場合)new
キーワードを使用せずにクラスをインスタンス化すると、内部変数がクラスのコンストラクター内でキーワードを使用して定義されている場合、その内部変数がスタック上にnew
作成されますか?それともヒープ上に作成されますか?
つまり、キーワードを使用してコンストラクター内で定義された変数 (配列など) を含むクラスまたは構造体があるnew
場合、使用せずにこのクラスのインスタンスを作成するnew
と、スタック上に内部配列が作成されます。ヒープ?
(C++ の場合)new
キーワードを使用せずにクラスをインスタンス化すると、内部変数がクラスのコンストラクター内でキーワードを使用して定義されている場合、その内部変数がスタック上にnew
作成されますか?それともヒープ上に作成されますか?
つまり、キーワードを使用してコンストラクター内で定義された変数 (配列など) を含むクラスまたは構造体があるnew
場合、使用せずにこのクラスのインスタンスを作成するnew
と、スタック上に内部配列が作成されます。ヒープ?
演算子 new は、オブジェクトが使用するメモリを自分で指すことができる配置 new 演算子を使用しない限り、ヒープにメモリを割り当てます。
new キーワードを使用してコンストラクター内で宣言された変数 (配列など) を含むクラスまたは構造体がある場合、new を使用せずにこのクラスのインスタンスを作成すると、スタックまたはヒープに内部配列が作成されます。 ?
はい、スタック上に (キーワードなしで) オブジェクトを作成してもnew
、クラス コンストラクターで new が使用されている場合、その内部データはヒープに割り当てられます (配置 new を使用してスタックにデータを割り当てる場合は例外になる可能性があります。後で)。一般的な例は、配列の割り当てです。
int main() {
int* t = new int[100]; // pointer is on stack, data on the heap
//...
}
同様に:
class A{
public:
A(){
int* t = new int[100];
std::cout<<"heap used\n";
delete t;
}
};
int main(int argc, char** argv) {
A a1;
// ...
}
プリント:
使用されるヒープ
実際、100int
がフリー ストアに割り当てられています (そして削除されています)。
メモリの場所を指定する必要がある場合は、placement newを使用できます。
char buf[1024];
string* p = new (buf) string("on stack"); // pointer is on stack,
// data on the stack
次のコードを検討し、最適化がないと仮定します。
struct Foo {
int* pointer_to_int;
Foo() : pointer_to_int(new int) { }
~Foo() { delete pointer_to_int; }
}
void func() {
Foo some_foo;
Foo* some_other_foo = new Foo;
}
some_foo
スタックに割り当てられます。スタックは少なくともsizeof(Foo)
(整数へのポインターを格納するのに十分なスペースになります ( sizeof(int*)
)) 増加します。
some_other_foo
の使用により、ヒープに格納されますnew
。繰り返しますが、少なくともsizeof(Foo)
割り当てられますが、今回はヒープからです。
どちらのint
場合も、Foo のコンストラクターで作成された はヒープに格納されます。これにより、ヒープのサイズが少なくともsizeof(int)
.