16

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

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

つまり、構造体は

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

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

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

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

4

2 に答える 2

32

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

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

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
于 2013-03-07T17:57:18.177 に答える
-1

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

于 2014-02-08T13:22:21.493 に答える