프로그램/C,C++

[C++ 기본 2] 12. 객체 복사(shallow copy)

naudhizb 2022. 3. 3. 00:27
반응형

C++ 컴파일러는 복사 생성자를 지정하지 않은 경우 디폴트 복사 생성자를 만들게 된다.
하지만 컴파일러는 포인터 변수에 대하여 얕은 복사를 수행하게 되어
원본 클래스의 포인터 변수는 실제로 복사되지 않고 포인터 값만 복제되어 복사생성자로 생성된 클래스의 멤버가 된다.

만약 원본 클래스의 life line이 종료되는 경우 복사생성자로 생성된 클래스의 포인터는 invalid한 값을 가리키게 된다.

이 때문에 클래스에 포인터 변수가 있는 경우 유저는 복사생성자를 직접 생성하여 deep copy를 직접 수행하여야 한다.

// 12_객체복사 - 102 page.. C++기본의 핵심 주제!!
#include <iostream>

// 클래스 안에 포인터 멤버가 있으면
// 컴파일러가 만드는 복사 생성자는 "얕은복사(shallow copy)"
// 현상을 일으킵니다.

// 반드시 사용자가 복사 생성자를 다시 만들어야 합니다.
// 어떻게 복사생성자를 만들것인가 ?
// 깊은복사/참조계수/소유권이전/복사금지


class Cat
{
    char* name;
    int   age;    
public:
    Cat(const char* n, int a ) : age(a) 
    {
        name = new char[strlen(n) + 1]; // null문자 고려
        strcpy(name, n);
    }
    ~Cat() { delete[] name; }
};
int main()
{
    Cat c1("nabi", 3);
    Cat c2 = c1;      // runtime error.
                        // 103 page 위쪽 그림.
}
반응형