얕은 복사

 

class CPlayer {
public:
    CPlayer(const char* name)
    {
        mName = static_cast<char*>(malloc(strlen(name) + 1));

        strcpy_s(mName, strlen(name) + 1, name);
    }

    ~CPlayer() {
        free(mName);
    }

    const char* GetName() {
        return mName;
    }

private:
    char* mName;
};

int main()
{
    CPlayer player("devhun");

    CPlayer p = player;

    std::cout << p.GetName();

    return 1;
}

 

  • 위 코드는 default 복사 생성자로 인해서 얕은 복사가 발생됩니다. 복사 생성자를 별도로 정의하지 않으면 멤버변수를 그대로 복사하는데, 그럴경우 malloc으로 할당받은 메모리를 가리키는 포인터가 2개로 늘어나는 문제가 발생됩니다.




깊은 복사

 

#include <iostream>
#include <Windows.h>

class CPlayer {
public:
    CPlayer(const char* name)
    {
        mName = static_cast<char*>(malloc(strlen(name) + 1));

        strcpy_s(mName, strlen(name) + 1, name);
    }

    CPlayer(const CPlayer& player) {

        mName = static_cast<char*>(malloc(strlen(player.mName) + 1));

        strcpy_s(mName, strlen(player.mName) + 1, player.mName);
    }

    ~CPlayer() {
        free(mName);
    }

    const char* GetName() {
        return mName;
    }

private:
    char* mName;
};

int main()
{
    CPlayer player("devhun");

    CPlayer p = player;

    std::cout << p.GetName();

    return 1;
}

 

  • 얕은 복사로 인해서 포인터가 복사되는 현상을 없애기 위해서는 복사 생성자를 직접 정의하여 깊은 복사를 하도록 구현해야 합니다. 깊은 복사는 인자로 전달된 인스턴스의 포인터 부분을 동적할당하여 직접 초기화하는 작업을 말합니다.




+ Recent posts