Chapter 3 자원관리


* 자원을 획득(동적할당)한 뒤에는 자원관리 객체에게 넘긴다. 그 후 소멸자를 통해 확실히 해제되도록 한다. 스마트 포인터를 사용하면 좋다.


* 자원관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 한다.


* 스마트 포인터를 매개변수로 넘길 경우에는 get함수를 이용하여 명시적으로 변환 후 넘겨줘야 한다.


* RAII (자원획득 즉 초기화) 클래스가 자원 접근 함수를 열어주는것이 캡슐화의 위배는 아니다. 애초에 RAII 클래스는 데이터 은닉이 목적이 아니기 때문이다.


* new-delete를 사용하면 메모리 할당->생성자 호출->소멸자 호출->메모리 해제 순으로 작동된다.


* new에 []를 사용하여 할당했다면 delete에도 반드시 []를 붙여서 깔끔하게 해제해야 한다.


* 배열 타입은 typedef로 만들지 않는것이 좋다. (ex ; typedef int iArray[4];)


* new로 생성한 객체의 포인터를 스마트포인터에 저장하는 코드는 별도의 한 문장으로 만들어준다. 스마트포인터의 생성자는 explicit로 선언되어 있기 때문에 명시적인 변환만 허용된다.

- ex1) processWidget(new Widget, priority()); (암시적인 변환이므로 컴파일 안됨)

- ex2) processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority()) (명시적인 변환이므로 컴파일 가능)

ex2) 와 같은 경우에는 메모리 누수에 대한 위험성에 노출되어있기 때문에 독립적인 문장으로 만들어주고 해당 스마트포인터를 인자로 넘겨준다.

+ Recent posts