2009-04-23 15 views
3

Grundsätzlich würde Ich mag den Unterschied zwischen
Int32^ i = gcnew Int32();
und
Int32* i2 = new Int32();
Ist Int32^i = gcnew Int32() auf verwaltetem Heap zugeordnet?

ich den folgenden Code geschrieben haben, wissen:

#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; 
} 

Es gibt die folgende Ausgabe:

004158B8 0 
00E1002C 0 

Es scheint Die zwei Integer werden an zwei verschiedenen Speicherplätzen zugewiesen.

Ist die gcnew Int32() in verwalteten Heap zugeordnet? oder direkt auf dem Stapel?

Antwort

8

In Managed C++ neuen allocates auf nicht verwalteten Heap, gcnew - auf verwalteten Heap. Objekte im verwalteten Heap eignen sich für die Garbage Collection, Objekte im nicht verwalteten Heap dagegen nicht. Zeiger mit ^ funktionieren wie C# Referenzen - die Laufzeit verfolgt sie und verwendet für Garbage Collection, Zeiger mit * funktionieren wie normale C++ Zeiger.

0

Ich habe die Antwort. gcnew wird das Objekt auf dem verwalteten Heap zuweisen, auch wenn der Typ ein Werttyp ist.

Daher Int32^i = gcnew Int32() wird das neu erstellte Objekt auf verwalteten Heap zuordnen.

Der folgende Code kann dies beweisen:

#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; 
} 

Es läuft mit Ausgang

14849324 
14849260 
14849196 
14849132 
14849068 
14849004 
14848940 
14848876 
14848812 
14848748 
14848684 
14848620 
14848556 
14848492 
14848428 
14848364 
Generation 0 collection happens at 146880 
Verwandte Themen