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) 와 같은 경우에는 메모리 누수에 대한 위험성에 노출되어있기 때문에 독립적인 문장으로 만들어주고 해당 스마트포인터를 인자로 넘겨준다.
'프로그래밍 > 공부' 카테고리의 다른 글
[자료구조] 트리, 그래프 (0) | 2022.07.23 |
---|---|
Effective C++ [4] 설계 및 선언 (0) | 2015.07.10 |
Effective C++ [2] 생성자, 소멸자 및 대입 연산자 (0) | 2015.07.08 |
Effective C++ [1] C++에 왔으면 C++의 법을 따릅시다 (0) | 2015.07.08 |
++i와 i++의 차이점 (0) | 2011.03.31 |