2017-11-03 2 views

답변

2

는 표준 (예 : this 온라인 초안), new에 의해 이전에 획득되지 않은 포인터를, -ing delete의 동작에 따르면, 정의되지 않는다 :

3.7.4.2 할당 해제 기능

(3) 예외를 throw하여 할당 해제 기능이 종료되면 동작이 정의되지 않습니다. 할당 해제 함수에 제공된 첫 번째 인수의 값은 널 포인터 값일 수 있습니다. 그렇다면 할당 해제 함수가 표준 라이브러리에 제공된 함수 인 경우 호출은 아무 효과가 없습니다. 그렇지 않으면 연산자 에 제공된 값 이 표준 라이브러리의 operator (delete * void)에 제공된 값 중 하나가 new (std :: size_t) 또는 new 연산자 인 중 하나가 아닌 경우 정의되지 않음 std :: size_t, const std :: nothrow_t &) 표준 라이브러리에 있으며 값이 표준 라이브러리의 operator delete에 제공된 경우 이전 연산자 호출에 의해 반환 된 값 중 하나가 아닌 경우 동작이 정의되지 않습니다 새 라이브러리 또는 연산자 new [] (std :: size_t, const std :: nothrow_t &)가 표준 라이브러리에 있습니다.

ptr+1의 값 new[] 의해 반환 한하지 않고, 따라서 delete[] (ptr+1) 호출은 UB이다. 그것이 올바르게 작동하는 것을 포함하여 어떤 일이 일어날 수 있습니다. 그러나 정확히 은 올바르게 작동하지 않을 것입니다..

+0

감사합니다. 그게 내가 포인터에 산술 연산을 피할 필요가 있다는 것을 의미합니까? – Giorgi

1

는 바와 같이 정의되지 않은 동작이다 here

삭제 [] 식

발현 신규 발현의 배열 형태에 의해 얻어진 널 포인터 값 또는 이전 포인터 값 이어야 . 만약 표현식이 이라면 그 배열은 배열이 아닌 형태 인 new-expression에 의해 얻은 포인터를 포함하여 동작은 정의되지 않습니다. delete[] 다른 포인터가 전달되는 경우는없는 것입니다 제공되는 포인터에서 삭제되는 요소 수에 대한 몇 가지 정보를 얻을 기대로

이 의미가 있습니다.