C++

깊은 복사와 얕은 복사 (1)

코다람쥐 2021. 12. 24. 00:06

https://www.youtube.com/watch?v=EuYdn_STq9U&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=71

1. 얕은 복사와 깊은 복사

int main() {
	int* a = new int(5);
	int* b = new int(3);

	a = b;
	 
	delete a;
	delete b;
}

이렇게하면 a = b를 할 때 주소가 덮어 씌워지기 때문에 메모리 누수가 발생할 뿐더러 delete에서 a가 b의 메모리를 해재해버려서 해제할 메모리가 없는 delete b;에서 런타임 에러도 발생한다.

 

그래서 a = b와 같이 코드를 작성해주는것을 주의해야 한다.

a = b를 참조만 복사하는 얕은 복사라고 하고,

*a = *b를 값을 복사하는 깊은 복사라고 한다.

 

2. String 클래스 구현해보기 with 동적할당

#include <iostream>

using namespace std;

class String {
public:
	String() {
		strData = NULL;
		len = 0;
	}

	String(const char* str) {
		len = strlen(str);
		strData = new char[len + 1];
		strcpy(strData, str); // 깊은 복사
	}

	~String() {
		delete[] strData;
	}

	char* GetStrData() const {
		return strData;
	}

	int GetLen() const {
		return len;
	}
private:
	char* strData;
	int len;
};

int main()
{
	String s;
}