티스토리 뷰

노트

The rule of 3 / 0

tose33 2022. 3. 24. 16:24

rule of 3

만약 클래스에 사용자가 정의한 복사 생성자, 소멸자, 복사 연산자(연산자 오버로딩) 중 하나라도 선언되어 있다면 세가지 모두 선언되어야 한다는 법칙이다.

3가지 모두가 필요한 이유는 리소스를 일관되게 관리하기 위함이다.

 

위 3가지를 직접 정의하지 않으면 디폴트 복사 생성자, 소멸자, 복사 연산자가 필요시 자동 호출되는데 그때 얕은 복사가 일어난다.

예를들어 하나의 객체가 다른 객체로 부터 디폴트 복사 생성자나 복사 연산자에 의해 복사됐을때를 생각해 보면.

하나의 객체를 삭제하게 되면 객체가 갖고 있는 맴버의 주소값이 제거되고 또 다른 객체가 제거 될때 이미 제거된 주소값을 또 다시 제거하게 된다. (얕은 복사에 의해 같은 주소값을 가르키고 있으므로) 

 

다른 경우는 객체가 복사될 때 문제가 생긴다.

다음과 같이 객체를 디폴트 복사 생성자에 의해 복사하게 되면 

Class cls1 = new Class("className");
Class cls2 = cls1; // 디폴트 복사 생성자 호출

디폴트 복사 생성자는 얕은 복사를 하기 때문에 cls2는 cls1가 가르키고 있는 "className"과 같은 주소를 가르키게 된다.

그런데 만약 cls2가 이미 어떤 주소값을 가르키고 있던 상황이라면 기존의 가르키고 있던 주소값은 디폴트 복사 생성자에 의해 바뀌어 버리므로 기존의 주소값은 잃어버려 메모리 누수로 이어진다.

(디폴트 대입 연산자: https://tose33.tistory.com/595)

 

 

rule of 0

rule of 0는 rule of 3와 같은 구식 스타일의 메모리 할당을 피하는 것이다.

배열 대신 vector와 같은 클래스를, char 배열 대신 string 클래스를 사용하면 rule of 3에서 발생하는 문제들을 해당 클래스가 내부적으로 해결해 주기 때문에 다른 클래스들은 사용자 정의 복사 생성자, 복사 연산자 등을 갖지 않도록 하는 것.

'노트' 카테고리의 다른 글

kotlin) Array<Int> vs IntArray  (0) 2022.04.28
꼬리 재귀 (Tail Recursion)  (0) 2022.04.07
PS 문제에서 메모리 초과 나는 경우  (0) 2022.03.15
c++) Priority Queue 구현  (0) 2022.03.07
JAVA의 우선순위 큐  (0) 2022.03.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함