[C++] 깊은 복사 얕은 복사

dd_ddong·2022년 7월 18일
0

c++

목록 보기
20/38

디폴트 복사 생성자의 문제점

class Person
{
private:
	char* name;
	int age;
public:
	Person(const char* myname, int myage) {
		int len = strlen(myname);
		name = new char[len];
		strcpy_s(name, len, myname);
		age = myage;
	}

	~Person() {
		delete []name;
		cout << "delete!!" << endl;
	}
};

다음과 같이 멤버변수에 동적할당으로 초기화를 한다고 가정한다면 소멸자에서 메모리 해제를 해줘애 메모리 릭이 발생하지 않는다.

Person man2 = man1;
그런데 여기서 디폴트 복사생성자로 위와 같은 코드를 작성한다면 비정상적인 결과가 나온다.

얕은 복사

디폴트 복사 생성자의 경우 멤버간 복사만 이뤄지므로 Person man2 = man1;에서 이뤄지는 일은 묘사하면

  • man2.name = man1.name;
    man2.age = man1.age;

여기서 man2.name 멤버변수의 경우 man1.name의 동적할당한 메모리의 주소값을 가지게 된다.
만약 man1객체가 먼저 없어지게 되면 man2.name에 저장된 주소값의 담긴 내용은 이미 메모리 해제된 상태일것이다.

이렇게 주소값만을 복사해 같은 대상을 가리키는 경우 얕은 복사라고 한다.

깊은 복사

같은 주소값을 복사하는게 아니라 새로 동적할당을 하고 안의 내용을 복사해 새로 동적할당한 메모리에 복사하는 것을 깊은 복사라 한다.

깊은 복사를 하는 Person객체의 생성자를 만들어보면


Person (const Person & ref){
	int len = strlen(ref.name);
    name = new char[len];
    strcpy_s(name, len, ref.name);
    age = ref.age;
}

기본 생성자에 있던 동적할당과 관련된 코드를 복사 생성자에서 작성해줘야한다.

0개의 댓글