본문 바로가기

개발공부

2024-12-23 c++ 얕은 복사 , 깊은 복사

 

 

얕은 복사(shallow copy)

 

대입연산자를 활용해서  두 개의 포인터가 같은 위치를 공유하는 것을 의미

#include <iostream>
using namespace std;

int main() {    
    int* A = new int(2);

    // 포인터 B에 A가 가리키는 메모리를 공유
    int* B = A;

    cout << *A << endl; // 출력: 2
    cout << *B << endl; // 출력: 2

    // A 동적 메모리를 해제
    delete A;
    
    
    //Undefined behavior 오류 발생
    cout << *B << endl; // dangling pointer 
 
 	return 0;
}

두 개의 포인터가 같은 위치를 공유하니 하나의 포인터에서 메모리를 해지시키면 다른 한 쪽에서 사용불가함.

 

(청소 빗자루를 2명이 사용하는데 한명이 버리면 다른 한명은 사용 못하는 것처럼)

 

dangling pointer가 발생할 수 있는 복사입니다.

 

 

깊은 복사(Depp Copy)

서로 다른 메모리 영역을 할당해서 위치를 공유 하는 것이 아닌 값을 복사하는 것을 말합니다.

하나가 해지해도 다른 하나는 해지되지 않습니다.

즉 dangling pointer가 발생할 수 없습니다.

 

#include <iostream>
using namespace std;

int main() {
    int* A = new int(2);

    // 포인터 B가 A가 가리키는 값을 복사 (깊은 복사)
    // 그냥 새로 만드는것에 값만 넣어준 격
    int* B = new int(*A);

    cout << *A << endl; // 출력: 2
    cout << *B << endl; // 출력: 2

    // A가 동적 메모리를 해제
    delete A;

    // B는 여전히 자신의 메모리를 관리
    cout << *B << endl; // 출력: 2

    // B의 메모리도 해제
    delete B;

    return 0;
}

 

 

포인터와 복사 개념을 통해

 

메모리 관리를 하는 방법을 배웠습니다.