2

(C++ の場合)newキーワードを使用せずにクラスをインスタンス化すると、内部変数がクラスのコンストラクター内でキーワードを使用して定義されている場合、その内部変数がスタック上にnew作成されますか?それともヒープ上に作成されますか?

つまり、キーワードを使用してコンストラクター内で定義された変数 (配列など) を含むクラスまたは構造体があるnew場合、使用せずにこのクラスのインスタンスを作成するnewと、スタック上に内部配列が作成されます。ヒープ?

4

5 に答える 5

3

演算子 new は、オブジェクトが使用するメモリを自分で指すことができる配置 new 演算子を使用しない限り、ヒープにメモリを割り当てます。

于 2013-11-15T08:16:09.740 に答える
3

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
于 2013-11-15T08:40:23.223 に答える
3

次のコードを検討し、最適化がないと仮定します。

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).

于 2013-11-15T08:34:20.167 に答える