본문 바로가기
프로그래밍 언어/C++

[C++] 깊은 복사 (Deep Copy)

by 까망 하르방 2025. 3. 16.
반응형

깊은 복사 (Deep Copy)

객체 복사할 때,

원본 객체가 가지고 있는 데이터를 새로운 메모리 공간에 복사하여

완전히 독립적인 객체를 만드는 방식

💡 깊은 복사가 필요한 경우
✅ 클래스 내부에 포인터 멤버 변수가 존재할 때
✅ 동적 메모리를 개별적으로 관리해야 할 때
✅ 동일한 데이터를 공유하지 않고, 독립적인 복사본이 필요할 때

 

📌 [C++] 얕은 복사 (Shallow Copy)

 

[C++] 얕은 복사 (Shallow Copy)

얕은 복사 (Shallow Copy)• 메모리 자체를 복사 하지 않고 주소만 복사• 일반적으로 「=」 연산자가 해당  [예제] 복사성생자 & 대입 연산자#include class Point{ int x = 0; int y = 0;public: Point() = default; Poi

zoosso.tistory.com

 

#include <iostream>

class vector
{
	int* ptr;
	std::size_t sz;

public:
	vector(std::size_t sz, int value = 0) : sz(sz)
	{
		ptr = new int[sz];

		for (std::size_t i; i < sz; i++)
		{
			ptr[i] = value;
		}
	}
	~vector() { delete[] ptr; }

	// 복사 생성자 직접 구현
	vector(const vector& other)
		: sz(other.sz)
	{
		ptr = new int[sz];
		memcpy(ptr, other.ptr, sizeof(int) * sz);
	}
};

int main()
{
	vector v1(5);

	vector v2 = v1; // 복사 생성자
}



[예제] 대입 연산자의 얕은 복사

#include <iostream>

class vector
{
	int* ptr;
	std::size_t sz;

public:
	vector(std::size_t sz, int value = 0) : sz(sz)
	{
		ptr = new int[sz];

		for (std::size_t i; i < sz; i++)
		{
			ptr[i] = value;
		}
	}
	~vector() { delete[] ptr; }
};

int main()
{
	vector v1(4, 1);
	vector v2(3, 2);

	v2 = v1; // 대입 연산자
}



복사 생성자와 마찬가지로 얕은 복사 문제가 있는 상태로
• v2 가  v1 와 같은 버퍼를 가리키면서 동시 변경
• 어느 한쪽의 버퍼를 삭제하면 다른 한쪽도 삭제

추가로, v2가 처음 만들어지면서 가리키고 있던
버퍼 메모리 누수가 발생할 수 있다.

 

#include <iostream>

class vector
{
	int* ptr;
	std::size_t sz;

public:
	vector(std::size_t sz, int value = 0) : sz(sz)
	{
		ptr = new int[sz];

		for (std::size_t i; i < sz; i++)
		{
			ptr[i] = value;
		}
	}
	~vector() { delete[] ptr; }

	vector & operator=(const vector& other)
	{
		// 자신 과의 대입 조사
		if (&other == this)
			return *this;

		if (sz != other.sz) // 같은 크기가 아닌 경우에만
		{
			sz = other.sz;

			delete[] ptr; // 먼저, 본인이 들고 있던 메모리 해제
			ptr = new int[sz];	
		}
		
		memcpy(ptr, other.ptr, sizeof(int) * sz);

		return *this;
	}
};

int main()
{
	vector v1(4, 1);
	vector v2(3, 2);

	v2 = v1; // 대입 연산자
}

깊은 복사 Deep Copy

반응형

댓글