2013-03-07 15 views
8

Ho provato googling questo, ma solo lingue obiettò orientati pop-up come risultati.copia superficiale e copia completa in C

Dalla mia comprensione una copia sta copiando alcuni membri di una struct.

Allora supponiamo una struct è

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

copiando il char ** sarebbe una copia

ma copiare l'intero collegato lista sarebbe una copia profonda?

Devo l'idea giusta o sono fuori strada? Grazie.

risposta

13

No. Una copia superficiale in questo particolare contesto significa che si copiano "riferimenti" (puntatori, qualunque cosa) agli oggetti e il backing store di questi riferimenti o puntatori è identico, è lo stesso oggetto nella stessa posizione di memoria .

Una copia profonda, al contrario, significa che si copia un intero oggetto (struct). Se ha membri che possono essere copiati superficiali o profondi, ne fai anche una copia profonda. Si consideri il seguente esempio:

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

Il costruttore di copia viene utilizzata per inizializzare il nuovo oggetto con l'oggetto creato in precedenza della stessa classe. Di default il compilatore ha scritto una copia superficiale. La copia superficiale funziona bene quando l'allocazione dinamica della memoria non è coinvolta perché quando è coinvolta l'allocazione dinamica della memoria allora entrambi gli oggetti puntano verso la stessa posizione di memoria in un heap, quindi per rimuovere questo problema abbiamo scritto una copia profonda in modo che entrambi gli oggetti abbiano la loro copia degli attributi in un ricordo. Per leggere i dettagli con esempi e spiegazioni completi, è possibile vedere la parte di questo articolo sulla differenza tra Shallow and Deep copy constructors.