공부중

[C++] 배열을 delete[] 가 아닌 delete로 제거했을 경우? 본문

Programing/C, C++

[C++] 배열을 delete[] 가 아닌 delete로 제거했을 경우?

곤란 2019. 4. 8. 23:25
반응형

회사에서 어쩌다보니 array delete 관련 이야기가 나와서 한번 해보려고 한다.

테스트 하고자 하는것은 아래와 같다.

동적할당으로 배열을 만들었는데 이것을 delete 할때

delete[] 가 아닌 일반 delete를 했을 경우 어떻게 처리가 되는가

실험 코드는 아래와 같다.

#include <iostream>

int main( )
{
    int* arr = new int[10];

    arr[0] = 0;
    arr[1] = 10;
    arr[2] = 20;
    arr[3] = 30;
    arr[4] = 40;
    arr[5] = 50;
    arr[6] = 60;
    arr[7] = 70;
    arr[8] = 80;
    arr[9] = 90;

    int* temp = (arr)+1;

    std::cout << arr[0] << std::endl;
    std::cout << *temp << std::endl;

    std::cout << "call delete" << std::endl;
    delete arr;

    std::cout << *temp << std::endl;

    return 0;
}

int 형 크기의 10개의 배열을 동적할당하고 값을 넣어준 뒤에

temp 포인터에 첫번째가 아닌 위치의 주소값을 저장하고

delelte[] 가 아닌 일반 delete를 호출했을때 어떻게 되는가를 알아보려고 한다.

테스트한 컴파일러는 2가지 해봤다

Microsoft VisualStudio 2019의 C++ 컴파일러와

g++ 6.4.0 버전 (현재 깔려있는 버전이 이거라서 최신버전인지 아닌지도 모르겠고 업데이트도 귀찮지만 아무튼 이걸로 했다)

 

먼저 MSVC 결과는 아래와 같다.

출력 결과는 위와 같이 delete만 해줬는데 배열 전부다 지워준 모습이다.

디버깅으로도 확인해 보면 이미 전부 지워져있는걸 볼 수 있다.

하지만 g++은 달랐다

delete로 넘겨준 그 주소만 날려먹고 나머지 부분은 delete가 안되어서 접근해보니 값이 살아 있다. 

 

일단 깔려있는 C++ 컴파일러가 이거 두개 뿐이라 두가지만 실험해 봤는데

일단 상식적으로는 g++의 결과가 맞다고 생각한다.

 

아무튼 동적배열은 delete[ ] 로 제거할것!

 

 

반응형