일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 예외
- 오블완
- reference
- 루아
- 암시적 변환
- 티스토리챌린지
- 메타테이블
- 스마트 포인터
- implicit conversion
- 영화
- exception
- c++
- more effective c++
- 다형성
- 상속
- lua
- operator new
- 반복자
- UE4
- effective stl
- Vector
- 참조자
- Effective c++
- 게임
- resource management class
- virtual function
- Smart Pointer
- 비교 함수 객체
- 언리얼
- 영화 리뷰
Archives
- Today
- Total
스토리텔링 개발자
[Effective C++] 16. new, delete 짝 맞춤 문제 본문
728x90
항목 16. new 및 delete를 사용할 때는 형태를 반드시 맞추자
new와 delete의 내부동작 순서
- new 연산자
- operator new 함수 내부에서 메모리를 할당한다.
- 할당된 메모리에 대해 한 개 이상의 생성자 호출된다.
- delete 연산자
- 할당된 메모리에 대해 한 개 이상의 소멸자가 호출된다.
- operator delete 함수 내부에서 메모리를 해제한다.
delete로 삭제되는 포인터의 종류
- delete로 삭제되는 포인터는 아래 두 종류 중 하나이다.
- 하지만, 각각은 메모리 배치 구조가 다르다.
- 단일 객체
- 메모리 배치 : [ object ]
- 객체의 배열
- 메모리 배치 : [ n ][ object ][ object ][..
- n은 배열의 크기 정보.
- 단일 객체
- delete 연산자는 자신에게 넘어온 포인터 종류가 둘 중 무엇인지 판단할 수 없다.
- 따라서 delete 연산자에게 어떤 포인터를 넘겼는지 알려줄 필요가 있다.
- 즉, new 표현식에 []를 썼으면 delete 표현식에도 []를 써야 한다.
new와 delete의 짝이 맞지 않는 경우
- 미정의 구현이므로 컴파일러에 따라 다른 동작을 하게 된다!
new와 delete 쌍을 맞출 때 유의점
- 클래스 내부에 동적 할당 메모리 포인터가 멤버 변수로 있는 경우
- 클래스 생성자가 여러개라면 각 생성자는 포인터에 동일한 버전의 new를 사용해야 한다.
- 다른 버전의 new를 사용하면 소멸자에서 delete 짝을 맞출 수 없다.
- 예컨대 어느 생성자는 배열로, 다른 생성자는 단일 객체로 생성한다면?
- 클래스 생성자가 여러개라면 각 생성자는 포인터에 동일한 버전의 new를 사용해야 한다.
- typedef로 정의된 타입 객체(배열)에 대해 new를 사용하는 경우
- 직관적으로 배열인지 아닌지 알기 어려우므로 주의해야 한다.
-
typedef std::string AddressLines[4]; // 배열을 typedef로 사용한 경우 ... std::string *pal = new AddressLines; ... // delete pal; // 이렇게 사용할 위험이 있다. delete[] pal; // 이렇게 마무리되어야 한다.
- 그러므로 되도록 배열은 typedef 타입으로 만들지 않는 것이 좋다.
728x90
'개발 > Effective C++' 카테고리의 다른 글
[Effective C++] 18. 인터페이스 설계 (1) | 2024.06.11 |
---|---|
[Effective C++] 17. 스마트 포인터 생성 시 예외 문제 (0) | 2024.06.10 |
[Effective C++] 15. 자원 관리 클래스 get 함수 제공하기 (0) | 2024.06.05 |
[Effective C++] 14. 자원 관리 클래스 복사 동작 (0) | 2024.06.04 |
[Effective C++] 13. 자원 관리 객체(RAII) (0) | 2024.06.03 |
Comments