shallow copy와 deep copy가 어떻게 다른지 알아보자
#include <iostream>
#include <cstring>
struct Test {
char *ptr;
};
void shallow_copy(const Test &src, Test &dest) {
dest.ptr = src.ptr;
}
void deep_copy(const Test &src, Test &dest) {
dest.ptr = new char[strlen(src.ptr) + 1]; // 메모리 할당
strcpy(dest.ptr, src.ptr); // 실제 데이터를 복사
}
int main() {
Test original;
original.ptr = new char[20];
strcpy(original.ptr, "Hello, World!");
Test shallow;
Test deep;
// 얕은 복사
shallow_copy(original, shallow);
// 깊은 복사
deep_copy(original, deep);
// 원본 객체와 복사된 객체의 값 비교
std::cout << "Original: " << original.ptr << std::endl;
std::cout << "Shallow Copy: " << shallow.ptr << std::endl;
std::cout << "Deep Copy: " << deep.ptr << std::endl;
// 원본 객체의 메모리 해제
delete[] original.ptr;
// 얕은 복사된 객체를 사용하면 문제가 발생할 수 있다.
std::cout << "After deleting original:" << std::endl;
std::cout << "Shallow Copy: " << shallow.ptr << std::endl;
std::cout << "Deep Copy: " << deep.ptr << std::endl;
// 깊은 복사된 객체의 메모리 해제
delete[] deep.ptr;
return 0;
}
얕은 복사(shallow copy)는 포인터 변수가 가리키는 메모리 주소만 복사하기 때문에, 메모리 해제 시 문제가 발생할 수 있다. 이로 인해 객체의 생명주기와 관련된 복잡한 문제들이 발생할 수 있다. 반면 깊은 복사(deep copy)는 새로운 메모리 공간을 할당하여 데이터를 복사하므로, 메모리 관리가 보다 안전하게 이루어진다. 실무에서는 대부분의 경우 깊은 복사를 사용하는 것이 권장된다.