항목 11. 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라
이유
1. 복사된 대상의 포인터의 값을 복사하기 때문이다.
해설
복사된 대상의 포인터 값만을 복사해서도 사용 가능하지만, 해체시 오류가 발생될수 있으므로 복사 생성자와 치환연산자를 깊은 복사로 하라는것 이다. 2008/06/02 14:00 수정
하라는것이 아닌, 작동 상태에 대해서 어떻게(얕은복사 깊은복사 등) 고려해 보라는 뜻
해결 방법
1. reference counting 을 사용하여, 0일경우 지우는 방법
- 객체를 복사할때 와 지울때마다 카운팅 하여, 0이 되면 삭제하는 방법이다.
2. 깊은복사를 위하여 복사생성자와 치환연산자를 변경하라
3. 복사 생성자와 치환연산자를 private: 에 묶어 버리는 방법으로 복사 치환을 막아버리는 방법이 있다.
덧붙여
1. 만약 char* babo = new char[1] 이라고 정의하여도 해체시에는 delete[] babo 로 동일한 형식을 갖추어야 한다. 항목 5 참조
(예상치 못한 결과를 발생시킨다)
2. 어떤 경우에는 일브로 얕은 복사를 행하기도 한다.
(개인적으로 함수내부에서 읽기 용도로만 쓰기 위해서 이렇께 쓴적이 있었지만, .. iterator 연산 잘하면 이럴 필요도 없을것이라고 뒤 늦게 생각나곤 한다.)
이유
1. 복사된 대상의 포인터의 값을 복사하기 때문이다.
해설
복사된 대상의 포인터 값만을 복사해서도 사용 가능하지만, 해체시 오류가 발생될수 있으므로 복사 생성자와 치환연산자를 깊은 복사로 하라는것 이다. 2008/06/02 14:00 수정
하라는것이 아닌, 작동 상태에 대해서 어떻게(얕은복사 깊은복사 등) 고려해 보라는 뜻
해결 방법
1. reference counting 을 사용하여, 0일경우 지우는 방법
- 객체를 복사할때 와 지울때마다 카운팅 하여, 0이 되면 삭제하는 방법이다.
2. 깊은복사를 위하여 복사생성자와 치환연산자를 변경하라
3. 복사 생성자와 치환연산자를 private: 에 묶어 버리는 방법으로 복사 치환을 막아버리는 방법이 있다.
덧붙여
1. 만약 char* babo = new char[1] 이라고 정의하여도 해체시에는 delete[] babo 로 동일한 형식을 갖추어야 한다. 항목 5 참조
(예상치 못한 결과를 발생시킨다)
2. 어떤 경우에는 일브로 얕은 복사를 행하기도 한다.
(개인적으로 함수내부에서 읽기 용도로만 쓰기 위해서 이렇께 쓴적이 있었지만, .. iterator 연산 잘하면 이럴 필요도 없을것이라고 뒤 늦게 생각나곤 한다.)
'책 정리 > Effective C++ 2판' 카테고리의 다른 글
항목 16. operator=에서 모든 데이터 멤버들로의 치환을 수행한다. (0) | 2008.05.08 |
---|---|
항목 15. operator= 이 *this에 대한 레퍼런스(reference)를 리턴(return)하도록 한다. (0) | 2008.05.08 |
항목 14. 베이스 클래스에서 소멸자는 가상 함수로 선언해야 한다. (0) | 2008.05.08 |
항목 13. 클래스에 선언된 순서에 따라 멤버 초기화 리스트에 멤버들을 나열한다. (0) | 2008.05.07 |
항목 12. 생성자에서 치환보다는 초기화를 사용한다. (0) | 2008.05.07 |
2부까지 종료 (0) | 2008.05.07 |
항목 10. operator new를 작성한다면 operator delete도 작성한다. (0) | 2008.05.07 |
항목 9. new의 "정상"형식을 감추지 않는다. (0) | 2008.05.07 |
항목 8. operator new와 operator delete 작성시 관례를 따른다. (0) | 2008.05.07 |
항목 7. 메모리가 모자랄 경우에 대비한다. (0) | 2008.05.07 |
최근댓글