1. 얕은 복사
얕은 복사(Shallow Copy)는 클래스 내의 포인터 멤버를 복사할 때, 포인터가 가리키는 데이터가 아니라 포인터가 저장하고 있는 주소값만 복사하는 것을 의미한다.
즉, 두 객체가 동일한 동적 메모리 영역을 가리키게 된다. 얕은 복사를 수행한 후 원본 객체가 메모리를 해제하면, 복사된 객체의 포인터는 해제된 메모리 영역을 가리키게 된다. 따라서 dangling pointer가 발생할 가능성이 존재한다.
아래 그림은 얕은 복사 시, 객체 내 멤버 변수 중 포인터가 어떻게 변하는지를 나타낸 그림과 코드이다.

#include <iostream>
using namespace std;
int main() {
// 포인터 A가 동적 메모리를 할당하고 값을 30으로 설정
int* A = new int(30);
// 포인터 B가 A가 가리키는 메모리를 공유
int* B = A;
cout << "A의 값: " << *A << endl; // 출력: 30
cout << "B의 값: " << *B << endl; // 출력: 30
// A가 동적 메모리를 해제
delete A;
// 이제 B는 Dangling Pointer(해제된 메모리를 가리키는 포인터)
// 이 시점에서 B를 통해 접근하면 Undefined Behavior 발생
cout << "B의 값 (dangling): " << *B << endl; // 위험: 정의되지 않은 동작
return 0;
}
2. 깊은 복사
깊은 복사(Deep Copy)는 클래스의 포인터 멤버가 가리키는 동적 데이터를 새롭게 할당된 독립적인 메모리 영역에 복제하는 것을 의미한다.
따라서 원본 객체와 복사된 객체는 서로 독립적인 메모리 공간을 소유하며, dangling pointer가 발생하지 않는다.
아래 그림은 깊은 복사 시, 객체 내 멤버 변수 중 포인터가 어떻게 변하는지를 나타낸 그림과 코드이다.

#include <iostream>
using namespace std;
int main() {
// 포인터 A가 동적 메모리를 할당하고 값을 30으로 설정
int* A = new int(30);
// 포인터 B가 A가 가리키는 값을 복사 (깊은 복사)
int* B = new int(*A);
cout << "A의 값: " << *A << endl; // 출력: 30
cout << "B의 값: " << *B << endl; // 출력: 30
// A가 동적 메모리를 해제
delete A;
// B는 여전히 독립적으로 자신의 메모리를 관리
cout << "B의 값 (깊은 복사 후): " << *B << endl; // 출력: 30
// B의 메모리도 해제
delete B;
return 0;
}'C++' 카테고리의 다른 글
| [C++] 콘솔 텍스트에 색상을 적용시키는 2가지 방법 (0) | 2025.06.25 |
|---|---|
| [C++] System() 함수 - "cls" , "pause" (0) | 2025.06.13 |
| [C++] 스마트 포인터(Smart Pointer) 개념 정리 (0) | 2025.06.12 |
| [C++] 헤더파일 중복방지 #Pragma once vs #ifndef ~ endif (0) | 2025.06.10 |
| [C++] 깔끔한 코드 작성법 - 헤더파일과 소스파일을 나누는 이유 (0) | 2025.06.05 |