본문 바로가기
Study/C++

[C++]복사 생성자(Copy Constructor)

by DawIT 2020. 12. 15.
320x100

얕은 복사와 깊은 복사

C++ 의 복사에는 두가지 개념이 존재한다.

 

하나는 얕은 복사(swallow copy) 그리고 하나는 깊은 복사(deep copy)

 

이 둘은 복사할 때 메모리의 할당에서 차이점이 존재한다.

 

얕은 복사와 깊은 복사

 

먼저 얕은 복사의 경우는 동적 할당을 받은 변수의 주소값을 공유한다. 즉 포인터 변수를 얕은 복사할 경우 새로운 포인터 변수는 기존 주소값을 가리키게 된다.

 

깊은 복사는 새로운 동적 할당을 만들고, 원본에 있는 데이터까지 복제한다.

 

일단 얕은 복사의 문제점

#include <iostream>
using namespace std;

class MyArray {
public:
	int size;
	int* data;

	MyArray(int size)
	{
		this->size = size;
		data = new int[size];
	}
	~MyArray()
	{
		if (data != NULL) delete[] this->data;
	}
};
int main()
{
	MyArray buffer(10);
	buffer.data[0] = 1;
	MyArray clone = buffer; // 에러
	buffer.data[0] = 2;
}

 

위와 같은 코드에서 에러가 발생한다. 그 이유는 MyArray clone = buffer; 에서 동적 메모리가 해제되었기 때문에 오류를 뱉는 것이다.

 

복사 생성자란

이러한 문제의 해결을 위해서 복사 생성자(copy constructor)가 존재한다. 이는 객체의 깊은 복사를 도와주는 도구이다.

 

복사 생성자는 클래스명 (const 클래스명 &참조변수) 의 형태를 가지고 있다. 상단 MyArray의 복사 생성자를 만들어본다.

 

 

이러한 형태의 복사 생성자를 정의하였다. 이렇게 되면 복사를 통해 만든 객체도 새로운 동적 메모리를 할당받게 되고 오류가 나지 않게 된다. 

 

댓글