얕은 복사
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;
}
- 얕은 복사로 인해서 포인터가 복사되는 현상을 없애기 위해서는 복사 생성자를 직접 정의하여 깊은 복사를 하도록 구현해야 합니다. 깊은 복사는 인자로 전달된 인스턴스의 포인터 부분을 동적할당하여 직접 초기화하는 작업을 말합니다.
'Programming Language > C, C++' 카테고리의 다른 글
C++ 가상함수와 추상 클래스 (0) | 2023.01.27 |
---|---|
new와 malloc의 차이점 (0) | 2023.01.27 |
C++의 RAII( Resource Acquisition Is Initialization ) 디자인 패턴이란 (0) | 2023.01.27 |
상속 관계에서 호출할 부모 생성자를 지정하는 방법 (0) | 2023.01.27 |
const 멤버 함수 (0) | 2023.01.27 |