web-dev-qa-db-ja.com

Cでの浅いコピーと深いコピー

これをグーグルで検索しようとしましたが、結果としてオブジェクト指向の言語のみがポップアップします。

私の理解では、浅いコピーは構造体の特定のメンバーをコピーしています。

つまり、構造体は

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

char **のコピーは浅いコピーになります

しかし、リンクリスト全体をコピーすることは深いコピーになるでしょうか?

私は正しい考えを持っていますか、それとも私は道を外れていますか?ありがとう。

11
ShadyBears

いいえ。この特定のコンテキストでの浅いコピーとは、「参照」(ポインタなど)をオブジェクトにコピーすることを意味します。これらの参照またはポインタのバッキングストアは同一であり、同じメモリ位置にあるまったく同じオブジェクトです。

対照的に、ディープコピーとは、オブジェクト全体(構造体)をコピーすることを意味します。浅いまたは深いコピーが可能なメンバーがある場合は、それらのディープコピーも作成します。次の例を考えてみましょう。

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
24
user529758

コピーコンストラクタは、同じクラスの以前に作成されたオブジェクトで新しいオブジェクトを初期化するために使用されます。デフォルトでは、コンパイラは浅いコピーを作成しました。動的メモリ割り当てが含まれている場合、両方のオブジェクトがヒープ内の同じメモリ位置を指すため、浅いコピーは正常に機能します。したがって、この問題を取り除くために、両方のオブジェクトが独自の属性のコピーを持つようにディープコピーを作成しました。メモリ内。完全な例と説明を含む詳細を読むために、 浅いコピーコンストラクターと深いコピーコンストラクター の違いに関するこの記事の部分を見ることができます。

0
royal52