[Data Structure] 동적할당된 배열을 늘리는 과정

예시 코드

#include <iostream>

int main() {
    int* p = new int[5];
	for (int i = 0; i < 5; i++) {
		p[i] = i*2;
	}
	//
	int* q = new int[10];
	for (int i = 0; i < 5; i++) {
		q[i] = p[i];
	}
	//
	delete[] p;
	p = q;
	q = nullptr;
	//
	for (int i = 0; i < 5; i++) {
		std::cout << p[i] << " ";
	}
    return 0;
}

동적할당된 배열의 전체 크기를 늘리는 로직에서 내부적으로는 아래의 과정을 거친다.

  • 기존 p배열을 q배열로 복사
  • p배열의 할당된 메모리 해제
  • p를 복사된 q주소를 가리키게 함. (새로운 자동차로 이동)
  • q을 삭제

delete[]와 delete의 차이?

포인터 배열의 동적할당 해제를 할때 []를 붙이곤 한다.

일반적인 동적 배열을 delete로 삭제해도 큰 문제가 없어보이지만, 꼭 []로 해제해야할 이유가 있다.

그건 클래스 타입의 동적 배열의 경우 delete로 삭제한다면 첫번째 클래스의 소멸자만 실행되고 나머지 원소들은 소멸자가 실행되지 않을것이다.

물론 일반적인 자료형 타입의 동적 배열도 []를 사용해 해제해주어야한다. 그렇지 않으면 첫번쨰 원소를 뺀 나머지 원소들이 메모리를 차지하고 있기 때문이다.