2016-03-27 2 views
0

-Code in C++Was passiert, wenn wir ein Objekt deklarieren und zuweisen auf ein anderes Objekt der gleichen Klasse

class FirstClass 
{ 
    public: 
     int var; 
}; 

int main() 
{ 
    FirstClass A, B; 
    A.var = 10; 
    B.var = 20; 

    cout << "Address of A : " << &A << endl; 
    cout << "A.var : " << A.var << endl << endl; 

    cout << "Address of B : " << &B << endl; 
    cout << "B.var : " << B.var << endl << endl; 

    A = B; 

    cout << "Address of A : " << &A << endl; 
    cout << "A.var : " << A.var << endl << endl; 

    cout << "Address of B : " << &B << endl; 
    cout << "B.var : " << B.var << endl << endl; 
} 

OutPut:

Adresse von A: 0x28fefc

A.var: 10

Adresse B: 0x28fef8

B.var: 20

Adresse von A: 0x28fefc

A.var: 20

Adresse B: 0x28fef8

B.var: 20

Ich weiß, was mit dem Speicher vor sich geht und Wert von var. Keine Verwechslung mit dem obigen Code. Punkt ist, dass der Speicher unterschiedlich bleibt und sich die beiden Objekte immer noch auf die gleichen alten Speicherorte beziehen. Bedeutet keine nicht referenzierte Erinnerung.


Code in Java;

tun, was ich oben in C++ - Code getan habe. Warum dieses Mal Müllsammler in Aktion tritt und indem wir A = B machen, warum wir eine nicht referenzierte Erinnerung bekommen.

+3

In Java wird A = B auf das Objekt zeigen, auf das aktuell gezeigt wird B. Es macht das ursprüngliche Objekt, auf das A verweist, nicht referenziert, was für die Speicherbereinigung geeignet ist. –

Antwort

3

Lassen Sie sich Ihren Code ändern, nur ein bisschen mehr Kontext zu geben:

FirstClass A = new FirstClass(1); 
FirstClass B = new FirstClass(2); 

An diesem Punkt FirstClass(1) und FirstClass(2) für GC nicht förderfähig sind, weil es zwei Variable im Gültigkeitsbereich, die derzeit auf diese Instanzen zeigen werden. Wenn Sie jedoch die Zeile ausführen:

A = B; 

Sie machen A und B Punkt FirstClass(2) und „nichts“ Punkt FirstClass(1) ... und da gibt es „nichts“ auf sie zeigen, wird FirstClass(1) für GC in Betracht.

Variablen in Java sind zwei Arten. Sie sind entweder primitive Typen (z. B. int, boolean) oder sind vom Typ Object. Primitive Werte werden immer bei der Zuweisung kopiert, aber Objektvariablen wie Zeiger in C++. Wenn Sie eine Objektvariable einer anderen zuweisen, ändern Sie nur den Speicherort, auf den sie zeigen, anstatt eine neue "kopierte" Instanz des Ziels zu erstellen.

2

Dies ist einer der Unterschiede in C++ und Java. Wenn Sie ein Objekt einem anderen Objekt in C++ zuweisen, kopiert es die Werte eines Objekts in ein anderes Objekt. Während in Java A als Verweis auf das Objekt, auf das B verweist, deklariert würde. Da nun JVM den Bezug zu B verloren hat und es nicht mehr erreichbar ist, wird es ein geeigneter Kandidat für GC.

+0

+1 für die einzige die C++ Seite der Frage zu verstehen (die Frage verwendet Objektzuordnung in C++, nicht Zeigerzuweisung). –

2

In Java, A und B sind wirklich Zeiger. Aber in Ihrem C++ Code sind sie nicht. Das ist der einzige Unterschied.

Wenn Sie die C++ ändern A und B auf Zeiger, werden Sie sehen, dass die beiden Teile des Codes sind nun äquivalent:

FirstClass* A = new FirstClass; 
FirstClass* B = new FirstClass; 
A->var = 10; 
B->var = 20; 

A = B; 

Jetzt A = B kopiert den Zeiger, nicht der Spitz einzuwenden, nur wie in Java. dass der Speicherbereich zu der gegebenen Referenzvariable new Schlüsselwort in Java

2

Trivial Objekterstellung in Java

SomeClass obj = new SomeClass(); 

Wenn Sie ein neues Objekt erstellen, wie oben gezeigt, JVM zuordnet erforderliche Speicher in dem Haufen Bereich und ordnen obj in unserem Fall. In Ihrem Fall reserviert es also Speicher für 2 Objekte und weist den Verweis den jeweiligen Referenzvariablen zu.

Wenn Sie

A = B; 

tun wir die JVM anweist, die Speicherreferenz, Referenzierung von B auf die Variable A. So sowohl A als auch B, jetzt auf den gleichen Speicherbereich zeigen zuweisen. Der andere Speicherbereich (auf den tatsächlich von A gezeigt wird, bevor die Zuweisungsanweisung ausgeführt wird) wird nicht durch irgendeinen Verweis angezeigt und ist somit für die Garbage Collection geeignet.

Verwandte Themen