2013-07-04 10 views
-1

다음과 같은 경우가 있습니다.삭제 대 삭제 []

int *arrayP=new int[4]; 
arrayP[0]=0;arrayP[1]=1;arrayP[2]=2;arrayP[3]=3; 
int *temp; 
cout<<arrayP[0]<<endl; 
temp=arrayP; 
++arrayP; 
cout<<arrayP[0]; 
cout<<arrayP[1]; 
delete temp; 
cout<<arrayP[0]; 

출력

0 
1 
2 
-1212222 

는 왜 이렇게입니까? arrayP는 크기가 4 인 배열의 첫 번째 요소를 가리 킵니다. 따라서 temp도 첫 번째 요소를 가리 킵니다 temp 요소를 삭제하면 첫 번째 요소도 전체 정수 배열을 삭제합니다. 배열은 배열의 다음 요소 주소를 저장합니다. 따라서 어레이는 고아가 아닙니다. arrayP [0]가 가비지 값을 표시하면서 정수 배열을 삭제했다고 가정합니다.

그런 경우 (예 : temp 삭제시 전체 정수 배열이 삭제됩니다) 삭제 []와 삭제 사이의 차이.

+3

이제 임시 임시 파일을 삭제하는 이유가 바로 여기에 있습니다. 'new'로 할당하지 않은 것을'delete'로 사용할 수 없습니다. 'new []'를 사용한다면'delete []'를 사용해야합니다. 일단이 규칙을 위반하면 모든 것이 의미가 없어집니다. 즉, 왜 누군가는'new []'을 사용할 것인가? –

+0

Ok. 내 코드가 더 이상 배열의 첫 번째 요소를 필요로하지 않는다고 가정 할 때, 그 공간을 비울 수있는 방법이 없다고 가정 해 봅시다. (작업을 수행하는 데 더 짧은 배열에 복사하고 목록을 연결하는 것을 피하고 싶습니다.) – user2511713

+0

배열의 첫 번째 요소가 필요하지 않지만 다른 요소가 필요하다면 참조 할 필요가 없습니다. 정말로 신경 쓰나요? – Bathsheba

답변

8

new[]을 사용하는 경우 delete[]과 균형을 맞추어야합니다.

new을 사용하는 경우 delete과 균형을 맞추어야합니다.

메모리 누수/프로그램 충돌 (기술적으로 정의되지 않은 동작)이 발생합니다. (예제에서 C++은 내부적으로 4 int을 생성 한 것으로 기록하고 있으며 delete[]을 호출하면 C++에서이 레코드에 액세스 할 수 있습니다.) delete을 호출하는 경우).