2013-01-16 4 views
1

제 3 행에서 무엇을하고 있는지 말해주십시오.해제 된 포인터가 할당되지 않았습니까?

int main(){ 

int *p = new int[3]; 

*p++=0; // What's this line doing? 

delete p; 

return 0; 
} 
+4

그 다음에 나오는 줄이 더 염려되어야합니다. – chris

+1

뭐하는거야? 두려운 정의되지 않은 동작을 호출합니다. 비강 악의 위험이 높을 준비를하십시오. – dmckee

답변

3

*p++=0; 이런 의미

  1. 쓰기 sizeof(int) 제로 바이트 p에 저장된 주소.
  2. p의 값을 sizeof(int)만큼 증가시킵니다.

즉, 포인터를 증가 시켰으며 delete에 전달하는 값은 연산자 new[]과 같은 값이 아닙니다.

@FredLarson도 언급했듯이 배열을 삭제하려면 delete [] p;을 사용해야합니다.

또한 포인터, 포인터 연산 및 사전/사후 증가를 읽는 것이 좋습니다. Definitive C++ Book Guide and List에서 책을 선택하십시오.

+1

그리고 포인터 값이 정확하더라도, 그것은'delete [] p;'이어야합니다. –

+0

고마워. 그리고 당신 말이 맞습니다. 저는 증분의 순서를 이해하지 못하고 여기서 할당합니다 ... – Arch1tect

+1

글쎄, 이제 너는 그렇게까지 갔다. 8v) 나는 자러 갔다. –

0

p [0]을 0으로 설정하고 포인터를 p [1]로 지정합니다. 너 뭐하려고?

1

배열의 첫 번째 요소는 0으로 설정되고 p는 두 번째 요소를 가리 키도록 1 씩 앞당겨집니다.

delete p; // this has undefined behaviour 

대신 delete [] p;을 사용하십시오.

관련 문제