[Effective C++] 항목 16 : new 및 delete를 사용할 때는 형태를 반드시 맞추자

수민이슈·2023년 3월 21일
0

Effective C++

목록 보기
16/30
post-thumbnail

스콧 마이어스의 Effective C++을 읽고 개인 공부 목적으로 요약 작성한 글입니다!

💡 new 표현식에 []을 썼으면, 대응되는 delete 표현식에도 []을 써야 한다!
💡 마찬가지로 new 표현식에 []을 안썼으면, 대응되는 delete 표현식에도 []을 쓰면 안된다!


🖊️ 객체 동적 할당 시 내부 동작

new 연산자로 동적 할당 하면

  1. 메모리가 할당된다.
  2. 할당된 메모리에 대해 한 개 이상의 생성자가 호출된다.

delete 연산자를 사용하면

  1. 할당된 메모리에 대해 한 개 이상의 소멸자가 호출된다.
  2. 그 메모리가 해제된다.

메모리 배치 구조

new를 통해 동적할당하면 힙에 메모리가 할당된다
그러면 메모리가 어떻게 배치되냐면

객체의 배열이 동적할당되면,,
힙 메모리에는 배열 원소의 개수 (size)가 올라간다.
그래서 delete연산자가 소멸자가 몇 번 호출되어야 하는지를 알 수 있다..


🖊️ delete 표현식

그래서 delete한테 객체의 배열의 크기가 얼마인지 알려주고 싶다면,
delete를 delete[]로 선언해주면 된다!!
그러면 delete가 포인터가 배열을 가리키고 있구나라고 알게 된다.

string* stringPtr1 = new string;
string* stringPtr2 = new string[100];
...
delete stringPtr1;
delete[] stringPtr2;

요렇게!!

typedef 사용 시 주의

typedef 로 정의된 어떤 타입의 객체의 배열을 메모리에 생성하려고 new를 쓰면,
나중에 어떤 형태의 delete를 해줘야 하는지는 내가 결정해야 한다.

typedef string AddressLines[4];

string* pal = new AddressLines;

delete pal;							// Error
delete[] pal;						// OK

ㅇㅋ?
근데 그냥
typedef를 굳이 쓰지 말자
vector<string> 하믄 되자나


😊 느낀점

new에는 delete
new[]에는 delete[]
당연하지만,, 메모리 내부 배치구조는 솔직히 몰랐당!!
새로 또 배워가유,,

0개의 댓글