2013-03-07 23 views
8

Próbowałem googling tego, ale tylko obiekty z obiektami zorientowanymi pojawiają się jako wyniki.Płytka kopia i głęboka kopia w C

Z mojego rozumu płytka kopia to kopiowanie niektórych elementów struktury.

więc powiedzmy, że struct jest

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

kopiowanie char ** byłoby płytkie kopia

ale kopiując listę cały związany byłby głęboko kopia?

Czy mam dobry pomysł, czy jestem daleko? Dzięki.

Odpowiedz

13

Nie. Płytka kopia w tym szczególnym kontekście oznacza, że ​​kopiuje się "odniesienia" (wskaźniki, cokolwiek) do obiektów, a baza danych tych odniesień lub wskaźników jest identyczna, to ten sam obiekt w tej samej lokalizacji pamięci .

Z kolei głęboka kopia oznacza, że ​​kopiuje się cały obiekt (strukturę). Jeśli ma członków, którzy mogą być kopiowane płytko lub głęboko, robisz także ich głęboką kopię. Rozważmy następujący przykład:

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

Konstruktor kopii służy do zainicjowania nowego obiektu z wcześniej utworzonym obiektem tej samej klasy. Domyślnie kompilator napisał płytką kopię. Płytka kopia działa dobrze, gdy alokacja dynamicznej pamięci nie jest zaangażowana, ponieważ przy zaangażowaniu dynamicznego przydzielania pamięci oba obiekty będą wskazywać w kierunku tej samej lokalizacji pamięci w stercie. Dlatego w celu usunięcia tego problemu napisaliśmy głęboką kopię, aby oba obiekty miały własną kopię atrybutów w pamięci. W celu zapoznania się ze szczegółami wraz z pełnymi przykładami i objaśnieniami można było zobaczyć fragment tego artykułu na temat różnicy między Shallow and Deep copy constructors.