길이가 0 인 배열에 대한 포인터의 속성 there’s no

치다

int main()
{
    auto a = new int[0];
    delete[] a; // So there's no memory leak
}

복사 초기화와 삭제 사이에 포인터를 읽을 수 a + 1있습니까?

또한 언어는 컴파일러 anullptr?



답변

    auto a = new int[0];

[basic.compound.3] 에 따르면 저장된 값 a은 다음 중 하나 여야합니다.

  1. (형식의 개체에 대한 포인터 int)
  2. 객체의 끝을 지나는 포인터
  3. 없는
  4. 무효

유형의 객체가 생성되지 않았으므로 첫 번째 가능성을 배제 할 수 있습니다 int. C ++에서 널이 아닌 포인터를 리턴해야하므로 세 번째 가능성은 배제됩니다 ( [basic.stc.dynamic.allocation.2] 참조 ). 따라서 우리는 두 가지 가능성이 있습니다 : 객체의 끝을 지나는 포인터 또는 유효하지 않은 포인터.

나는 a최후의 포인터로 생각하는 경향이 있지만, 그것을 확실하게 확립 할 수있는 평판 좋은 참조는 없습니다. (그러나 [basic.stc] 에서는 delete이 포인터 가 어떻게 사용되는지 알 수 있습니다 .) 따라서이 답변에서 두 가지 가능성을 모두 접할 것입니다.

복사 초기화와 삭제 사이에 포인터를 읽을 수 a + 1있습니까?

위의 가능성에 관계없이 [expr.add.4] 에 명시된대로 동작은 정의되지 않습니다 .

경우 a과거 – 더 – 엔드 포인터,이어서,이를 인덱스 가상 소자 포인트 여겨진다 0없는 요소 배열. 정수를 추가 j하는 a경우에만 정의된다 0≤0+j≤n여기서, n상기 어레이의 크기이다. 우리의 경우, n제로, 그래서 합이 a+j경우에만 정의되어 j있다 0. 특히 추가 1는 정의되지 않습니다.

a유효하지 않은 경우 에는 “그렇지 않으면 동작이 정의되지 않습니다.” (정말로 정의 된 경우에는 유효한 포인터 값만 포함됩니다.)

또한 언어는 컴파일러 anullptr?

아니요. 위에서 언급 한 [basic.stc.dynamic.allocation.2]에서 : “요청이 성공하면 교체 가능한 할당 함수가 반환 한 값은 널이 아닌 포인터 값 입니다. 또한 C ++ (C는 아님)에 제로 요청에 대한 응답으로 null이 아닌 포인터가 필요하다는 각주 가 있습니다 .


답변

의 결과로 최근 CWG 반사판 토론 당 편집 문제 3178 , new int[0]현재 무엇이라고 낸다 “과거 – 더 – 끝”포인터 값 .

뒤에는a 널 이 될 수 없으며 [expr.add] / 4에a + 1 의해 정의되지 않습니다 .


답변