3

基本的に と の違いを知りたい
Int32^ i = gcnew Int32();
です
Int32* i2 = new Int32();

私は次のコードを書きました:

#include <stdio.h>
#using <mscorlib.dll>

using namespace System;

int main(void) {

    Int32^ i = gcnew Int32();
    Int32* i2 = new Int32();

    printf("%p %d\n", i2, *i2);
    printf("%p %d\n", i, *i);

    return 0;
}

次の出力が得られます。

004158B8 0
00E1002C 0

2 つの整数が 2 つの異なるメモリ位置に割り当てられているようです。

gcnew Int32()はマネージド ヒープに割り当てられていますか? またはスタックに直接?

4

2 に答える 2

8

マネージ C++ では、アンマネージ ヒープにnewを割り当て、 gcnew - マネージ ヒープに割り当てます。マネージド ヒープ内のオブジェクトはガベージ コレクションの対象になりますが、アンマネージド ヒープ内のオブジェクトは対象外です。^を含むポインターはC# 参照のように機能します。ランタイムはそれらを追跡し、ガベージ コレクションに使用します。* を含むポインターは、通常の C++ ポインターのように機能します。

于 2009-04-23T04:14:54.743 に答える
0

私は答えを得ました。gcnew は、型が値型であっても、マネージド ヒープにオブジェクトを割り当てます。

したがって、 Int32^ i = gcnew Int32() は、マネージド ヒープに新しく作成されたオブジェクトを割り当てます。

次のコードはこれを証明できます。

#include <stdio.h>
#using <mscorlib.dll>

using namespace System;

int main(void) {
    Object^ o = gcnew Object();
    long j = 0;

    while (GC::GetGeneration(o) == 0) {
        Int32^ i = gcnew Int32();
        j += 4;

        if (j % 100 == 0) {
            printf("%d\n", i);
        }
    }

    printf("Generation 0 collection happens at %ld\n", j);        

    return 0;
}

出力で実行されます

14849324
14849260
14849196
14849132
14849068
14849004
14848940
14848876
14848812
14848748
14848684
14848620
14848556
14848492
14848428
14848364
Generation 0 collection happens at 146880
于 2009-04-23T04:19:17.027 に答える