2016-06-03 3 views

답변

3

배열 중간에 정의되지 않은 동작 인 delete을 호출하고 있습니다. 이 간단한 경우 당신은 당신은 색인을

p[0] = 1; 
p[1] = 2; 

를 사용하도록 코드를 조정해야

delete [] (p - 1); 

배열의 시작으로 돌아가하거나 포인터의 복사본을 만들 필요 했어

auto p2 = p; 
*p2 = 1; 
++p2; 
*p2 = 2; 
delete [] p; 
0

아니요, 아니요, new이 아닌 포인터입니다. 원래 포인터 값 new이 변경되었습니다.

그렇게하는 올바른 방법은 다음과 같습니다이 경우

int* p = new int[3]; 
p[0] = 1; 
p[1] = 2; 
delete[] p; 

당신은 당신이 할당 된 메모리에 원래의 포인터를 유지한다.

포인터에서 산술 연산을 수행하려면 원래 값을 저장해야 delete[]에 전달할 수 있습니다.

int* p = new int[3]; 
int* orig = p; 
*p = 1; 
p++; 
*p = 2; 
delete[] orig; 
관련 문제