본문 바로가기

Language/C++

복사생성자 (깊은 복사)

얕은 복사생성자 로는 한계가 있다는걸 알았다.

바로 메모리를 동적할당시 복사를 하게 되면 동적된 메모리의 주소를 공유 하게 되며, 복사가 이루어지고 소멸자 함수가 호출되면서 에러를 발생시킨다는 것이다.

얕은복사로 에러가 나는 코드를 수정하면 다음과 같다.

#include<iostream.h>
#include<string.h>

class Person
{
    char *name;
    char *phone;
    int age;
public:
    Person(char* _name,char* _phone, int _age);
    Person(Person& p);
    ~Person();
    void ShowData();
};
Person::Person(char* _name, char* _phone, int _age)
{
    name = new char[strlen(_name)+1];
    strcpy(name, _name);

    phone = new char[strlen(_phone)+1];
    strcpy(phone, _phone);

    age = _age;
}
Person::Person(Person& p)//복사 생성자(깊은 복사.)
{
    name = new char[strlen(p.name)+1];
    strcpy(name,p.name);
    phone = new char[strlen(p.phone)+1];
    strcpy(phone,p.phone);
    age = p.age;
}

Person::~Person()
{
    delete []name;
    delete []phone;
}

void Person::ShowData()
{
    cout<<"name : "<<name<<endl;
    cout<<"phone: "<<phone<<endl;
    cout<<"age : "<<age<<endl;
}

int main()
{
    Person p1("KIM","013-333-555",22);
    Person p2 = p1;//묵시적으로 Person p2(p1);로 변환된다.
    p1.ShowData();
    p2.ShowData();

    return 0;
}

깊은 복사의 예이다