2013-07-07 4 views
0

나는 포인터를 공부하고있다. 나는 delete [] 연산자와 혼동했다. 내가 제대로 받았다면C++ delete [] 연산자 혼란

int* a = new int[12]; 

for (int i=0; i<12; i++) 
    a[i]=123; 

delete[] a; 

for (int i=0; i<12; i++) 
    cout <<a[i]<<" "; 

delete[] 연산자는 배열에있는 모든 오브젝트를 32 파괴해야합니다 다음은 예입니다. 하지만 내 출력은 이것이다 :

10621288 10617028 123 123 123 123 123 123 123 123 123 123 

만 처음 두 요소가 파괴된다. 내가 잘못 했나요?

답변

2

잘못 수행 한 것은 a의 내용을 삭제 한 후에 액세스하려고 시도한 것입니다. 이렇게하면 정의되지 않은 비헤이비어 (UB)가 호출됩니다. 절대 그렇게해서는 안됩니다. 코드에 크래시가있는 버그입니다.

결과는 "하나"의 특정 특수화에 불과합니다. 다른 시스템에서이 프로그램을 실행하거나 다른 컴파일러를 사용하거나 다른 설정으로 동일한 컴파일러를 사용하면 결국 다른 작업을 수행하게됩니다.

+0

@ kr4lj :이 경우 배열에 정수가 포함되어 있기 때문에 파괴 할 것이 없습니다. 배열 자체의 메모리 만 해제됩니다. 배열에 객체가 포함되어 있으면 소멸자가 하나씩 호출되는 것을 볼 수 있습니다. – Jon

+0

나는 똑같은 짓을했는데 처음 두 요소는 0으로 만들었습니다. 메모리 위치를 물리적으로 삭제할 수는 없습니다. D는 컴파일러에서 0이 null이고 나중에 사용하기 위해 해제되면 0을 만듭니다. –

2

이미 릴리스 된 메모리에 액세스하려고하므로 코드에서 정의되지 않은 동작을 호출합니다. 어떤 일이든 일어날 수있다.

1

코드에 정의되지 않은 동작이 표시됩니다. 기억을 파괴하는 것은 책이나 꽃병을 파괴하는 것과 같지 않습니다. 기억은 사라지지 않으며 그 내용 중 일부는 원래대로 남아있을 수 있습니다.

그러나 이러한 메모리에 액세스하면 프로그램이 불법입니다. 프로그램이 더 이상 해당 메모리를 소유하지 않으며 다른 코드 나 프로그램의 다른 부분에 속합니다. 해당 메모리의 모든 부분은 언제든지 덮어 쓸 수 있습니다. 또한 이러한 메모리에 액세스 할 때 프로그램이 중단 될 수 있습니다.

2

출력이 여전히 데이터가 실제로있는 것처럼 보이는 행운의이 있습니다. 그러나 당신의 이해는 정확합니다. 삭제 [] a를 수행해야합니다.

다른 날에는 충돌이 발생했을 것입니다. 포인터 deferencing 예외가 잘못되었습니다.