5. 소멸자에 넣거나 스마트 포인터를 이용하자
• Createinvestment로 얻은 힙의 주소값을 객체로 넘겨주고 있다. ( RAII )
• 객체의 소멸자에서 자신이 관리하는 힙의 주소값을 해제해주면 객체의 소멸과 함께 자동으
로 소멸자가 실행된다.
• 한 주소값에 여러 개의 스마트 포인터가 참조해선 안된다. (여러 번 해제된다.)
• 스마트포인터를 복사할 경우 원본은 자동으로 null이 된다.
• 정상적인 복사를 요구하는 상황에서는 사용할 수 없다.
6. 앙된다면, RCSP를 사용하자
• 참조 카운팅 방식 스마트 포인터
• 가비지 컬렉션과 같은 동작원리
• 어? 어디선가 본 것 같다 -> windows handle
• 서로 참조하는 상황을 피해야 한다
7. 지금까지 마치 동적할당도 된다는 듯 이야기 했지만….
동적할당은 불가능하다!!!(컴파일러도 모른다!!)
delete와 delete[]는 다르다.
vector나 string으로 대처하자.
9. 스마트 포인터를 만들어보자
• auto_ptr와 shared_ptr 는 왠만하면 힙에 할당된 자원관리에 사용
하자
• Mutex타입 등의 힙에 할당되지 않는 자원 관리는 직접 만들어야
할 때가 많다
• auto_ptr와 shared_ptr 는 더 이상 참조하지 않을 경우 delete 해
버린다. 이 경우는 unlock을 해야 하는 상황과는 일치 하지 않는
다.
37. shared_ptr을 통해 극복하자
Shared_ptr에 null을 넣고 싶은데 두 번째 인자도 함께 쓰고 싶을 때(하지만 바로 생성자에 넘깁시다.)
교차 dll 문제를 피할 수 있다.(생성한 dll과 다른 dll에서 소멸할 때 생기는 런타임 에러현상)
a.dll에서 위 shared_ptr을 받았다고 해도 어느 dll들 사이를 이리저리 넘겨도 상관이 없다.
하지만 내부 동적 할당이 붙어있고 원시 포인터보다 느리다.
39. 고려하자
• 객체 생성 및 소멸은 어떻게 이루어져야 하는가?
• 객체 초기화와 대입은 어떻게 구분할 것인가?
• 값에 의한 전달(복사 생성자)는 어떤 의미인가?
• 객체(타입)이 가질 적합한 값이란 무엇인가?
• 상속할 것인가? 어떤 함수를 가상함수로 할 것인가?
• 어떤 종류의 타입변환을 허용할 것인가? 명시적? 암시적?
• 어떤 연산자와 함수를 둘 것인가?
• 표준함수들 중 어떤 것을 허용하지 않을 것인가?
• 접근권한을 어떻게 줄 것인가?(public? protected? private?)
• 무엇을 보장하는 객체(타입)인가?
• 정말로 필요한가?
• 얼마나 일반적인가? 다른 타입과 비교해보자 (int 등)
42. 비용이 많이 들기 때문
• 우선 매개변수로 초기화 시키기 위한 복사 생성자
• 내부에 멤버 객체가 있다면 그들의 생성을 위한 생성자
• 상속받았다면 부모의 값을 읽어오기 위한 부모 생성자
• 또 부모의 내부에 멤버 객체가 있다면 그들의 생성을 위한 생…
• 무한반복
• 마지막으로 함수가 끝날 때 생성한 만큼의 소멸자들