ディープコピーとシャローコピー¶
ディープコピー¶
C++ のコピーは基本的にはディープコピーと呼ばれるものです。
ディープコピーは実体ごとコピーされるため、コピーした分のメモリ領域の確保が必要になります。 ディープコピーの場合、コピー先(or コピー元)のオブジェクトを編集しても、他方のオブジェクトには影響を及ぼしません。
int x = 100;
int y = x; // x を y へディープコピー(図1)
y = 50; // y を 50 に書き換える(図2)
std::cout << x << std::endl; // x は100のまま
図1
図2
シャローコピー¶
ポインタをコピーする場合はシャローコピーになります。
シャローコピーではポインタの向き先だけがコピーされ、実体はコピー元の領域のままなので、 ディープコピーのようなコピーした分のメモリの確保は起きません。
参照の場合も、ポインタと同様にシャローコピーになります。
int* x = new int(100);
int* y = x; // x を y へシャローコピー(図3)
*y = 50; // y が指す先の値を 50 に書き換える(図4)
std::cout << *x << std::endl; // x が指す先の値も 50 になる
図3
図4
関数の引数¶
ディープコピーとシャローコピーは関数の引数でも区別されます。
#include <iostream>
void ChangeToFifty1(int v) { // ディープコピー
v = 50;
}
void ChangeToFifty2(int* v) { // シャローコピー
*v = 50;
}
int main() {
int a = 100;
ChangeToFifty1(a);
std::cout << a << std::endl; // 100
int b = 100;
ChangeToFifty2(&b);
std::cout << b << std::endl; // 50
return 0;
}