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의 복사 생성자를 만들어본다.
이러한 형태의 복사 생성자를 정의하였다. 이렇게 되면 복사를 통해 만든 객체도 새로운 동적 메모리를 할당받게 되고 오류가 나지 않게 된다.
'Study > C++' 카테고리의 다른 글
[C++]템플릿(Template) (0) | 2020.12.17 |
---|---|
[C++]예외처리(Exception Handling) (0) | 2020.12.16 |
[C++]연산자 중복(연산자 오버로딩) (0) | 2020.12.14 |
[C++]업캐스팅과 가상함수, 순수가상함수 (0) | 2020.12.13 |
[C++]STL Vector 자주 쓰는 기초적인 코드들 (0) | 2020.12.12 |
댓글