2013-03-07 12 views
8

Ich versuchte googeln, aber nur objektorientierte Sprachen Pop-up als Ergebnisse.Flache Kopie und tiefe Kopie in C

Aus meinem Verständnis kopiert eine flache Kopie bestimmte Mitglieder einer Struktur.

können so sagen, eine Struktur

typedef struct node 
{ 
    char **ok; 
    int hi; 
    int yep; 
    struct node *next; 
}node_t 

Kopieren der char ** wäre eine flache Kopie

, sondern die gesamte verknüpfte Liste Kopieren wäre eine tiefe Kopie sein?

Habe ich die richtige Idee oder bin ich weg? Vielen Dank.

Antwort

13

Nein. Eine flache Kopie in diesem bestimmten Kontext bedeutet, dass Sie "Referenzen" (Zeiger, was auch immer) an Objekte kopieren, und der Hintergrundspeicher dieser Referenzen oder Zeiger ist identisch, es ist das gleiche Objekt am gleichen Speicherort .

Eine tiefe Kopie bedeutet dagegen, dass Sie ein gesamtes Objekt (struct) kopieren. Wenn es Mitglieder hat, die flach oder tief kopiert werden können, machen Sie auch eine tiefe Kopie von ihnen. Betrachten Sie das folgende Beispiel:

typedef struct { 
    char *name; 
    int value; 
} Node; 

Node n1, n2, n3; 

char name[] = "This is the name"; 

n1 = (Node){ name, 1337 }; 
n2 = n1; // Shallow copy, n2.name points to the same string as n1.name 

n3.value = n1.value; 
n3.name = strdup(n1.name); // Deep copy - n3.name is identical to n1.name regarding 
          // its *contents* only, but it's not anymore the same pointer 
0

Der Kopierkonstruktor wird verwendet, um das neue Objekt mit dem zuvor erstellten Objekt der gleichen Klasse zu initialisieren. Standardmäßig hat der Compiler eine flache Kopie geschrieben. Flache Kopie funktioniert gut, wenn dynamische Speicherzuordnung nicht beteiligt ist, da bei der dynamischen Speicherzuordnung beide Objekte in Richtung auf den gleichen Speicherort in einem Heap zeigen. Um dieses Problem zu entfernen, haben wir daher tiefe Kopie geschrieben, so dass beide Objekte ihre eigene Kopie der Attribute haben in einer Erinnerung. Um die Details mit vollständigen Beispielen und Erklärungen zu lesen, können Sie den Teil dieses Artikels über den Unterschied zwischen Shallow and Deep copy constructors sehen.

Verwandte Themen