int main(void)

{

Point pos1(5, 5);        //복사생성자의 대표적인 상황.

Point pos2 = pos1;

}


※ 중요한 사실은 새로 생성하는 객체 pos2의 초기회에 기존에 생성된 객체 pos1이 사용되었다는 점이다.


int main(void)

{

Point pos1(5, 5);        //대입 연산자의 대표적인 상황.

Point pos2(3, 3);


pos2 = pos1;

}


※ 중요한 사실은 pos2도, 그리고 pos1도 이미 생성 및 초기화가 진행된 객체라는 사실이다.





디폴트 대입 연산자의 문제..



called destructor! 이것이 딱 한번만 출력되었다는 것을 보아 소멸자의 호출과정에서 문제가 발생했음을 알 수 있다.


37행: man2가 가리키고 있던 주소 값을 읽게 되므로, 더 이상 문자열에 접근이 불가능하다.

 때문에 소멸도 불가능한 상태가 되어 메모리의 누수로 이어지게 된다.



# 정리하면, 생성자 내에서 동적 할당을 하는 경우, 디폴트 대입 연산자는 두 가지 문제를 일으키므로 다음의 형태로 직접 대입 연산자를 정의해야 한다.


1. 깊은 복사를 진행하도록 정의한다. 

2. 메모리 누수가 발생하지 않도록, 깊은 복사에 앞서 메모리 해제의 과정을 거친다.




Posted by scii
: