스토리텔링 개발자

[Effective C++] 16. new, delete 짝 맞춤 문제 본문

개발/Effective C++

[Effective C++] 16. new, delete 짝 맞춤 문제

김디트 2024. 6. 7. 10:40
728x90

항목 16. new 및 delete를 사용할 때는 형태를 반드시 맞추자

 

 

 

new와 delete의 내부동작 순서
  • new 연산자
    1. operator new 함수 내부에서 메모리를 할당한다.
    2. 할당된 메모리에 대해 한 개 이상의 생성자 호출된다.
  • delete 연산자
    1. 할당된 메모리에 대해 한 개 이상의 소멸자가 호출된다.
    2. operator delete 함수 내부에서 메모리를 해제한다.

 

 

 

delete로 삭제되는 포인터의 종류
  • delete로 삭제되는 포인터는 아래 두 종류 중 하나이다.
  • 하지만, 각각은 메모리 배치 구조가 다르다.
    • 단일 객체
      • 메모리 배치 : [ object ]
    • 객체의 배열
      • 메모리 배치 :  [ n ][ object ][ object ][..
      • n은 배열의 크기 정보.
  • delete 연산자는 자신에게 넘어온 포인터 종류가 둘 중 무엇인지 판단할 수 없다.
    • 따라서 delete 연산자에게 어떤 포인터를 넘겼는지 알려줄 필요가 있다.
  • 즉, new 표현식에 []를 썼으면 delete 표현식에도 []를 써야 한다.

 

 

 

new와 delete의 짝이 맞지 않는 경우
  • 미정의 구현이므로 컴파일러에 따라 다른 동작을 하게 된다!

 

 

 

new와 delete 쌍을 맞출 때 유의점
  • 클래스 내부에 동적 할당 메모리 포인터가 멤버 변수로 있는 경우
    • 클래스 생성자가 여러개라면 각 생성자는 포인터에 동일한 버전의 new를 사용해야 한다.
      • 다른 버전의 new를 사용하면 소멸자에서 delete 짝을 맞출 수 없다.
      • 예컨대 어느 생성자는 배열로, 다른 생성자는 단일 객체로 생성한다면?
  • typedef로 정의된 타입 객체(배열)에 대해 new를 사용하는 경우
    • 직관적으로 배열인지 아닌지 알기 어려우므로 주의해야 한다.
    • typedef std::string AddressLines[4]; // 배열을 typedef로 사용한 경우
      ...
      std::string *pal = new AddressLines;
      ...
      // delete pal; // 이렇게 사용할 위험이 있다.
      delete[] pal; // 이렇게 마무리되어야 한다.
    • 그러므로 되도록 배열은 typedef 타입으로 만들지 않는 것이 좋다.
728x90
Comments