[c++] C ++ new int [0] — 메모리를 할당합니까?

간단한 테스트 앱 :

cout << new int[0] << endl;

출력 :

0x876c0b8

따라서 작동하는 것처럼 보입니다. 표준은 이것에 대해 무엇을 말합니까? 빈 메모리 블록을 “할당”하는 것이 항상 합법적인가요?



답변

5.3.4 / 7에서

direct-new-declarator의 표현식 값이 0이면, 할당 함수가 호출되어 요소가없는 배열을 할당합니다.

3.7.3.1/2에서

크기가 0 인 요청으로 반환 된 포인터를 역 참조하는 효과는 정의되어 있지 않습니다.

또한

새로 요청한 공간의 크기가 0 인 경우에도 요청이 실패 할 수 있습니다.

즉, 할 수는 있지만 합법적으로 (모든 플랫폼에서 잘 정의 된 방식으로) 얻은 메모리를 참조 해제 할 수는 없습니다. 배열 삭제에만 전달할 수 있으므로 삭제해야합니다.

3.7.3.1/2의 문장에 첨부 된 흥미로운 각주 (표준의 규범적인 부분은 아니지만 설명 목적으로 포함)

[32. 의도는 malloc () 또는 calloc ()을 호출하여 연산자 new ()를 구현할 수 있도록하는 것이므로 규칙은 실질적으로 동일합니다. C ++은 널이 아닌 포인터를 리턴하기 위해 제로 요청이 필요하다는 점에서 C와 다릅니다.]


답변

예, 이와 같이 0 크기의 배열을 할당하는 것이 합법적입니다. 그러나 삭제해야합니다.


답변

표준은 이것에 대해 무엇을 말합니까? 빈 메모리 블록을 “할당”하는 것이 항상 합법적인가요?

모든 객체에는 고유 한 ID, 즉 고유 한 주소가 있으며 길이가 0이 아닌 것을 의미합니다 (0 바이트를 요청하면 실제 메모리 양이 자동으로 증가 함).

이러한 개체 중 하나 이상을 할당 한 경우 주소가 다른 것을 알 수 있습니다.


답변

으로 0크기가 지정된 블록 을 할당하는 것은 완전히 합법적 입니다 new. 액세스 할 유효한 데이터가 없기 때문에 유용한 정보를 얻을 수 없습니다.int[0] = 5;불법입니다.

그러나 나는 표준 malloc(0)이 돌아 오는 것과 같은 것들을 허용한다고 믿습니다.NULL .

delete []할당에서 다시 얻는 포인터 에도 여전히 필요합니다 .


답변

흥미롭게도 C ++에서는 0 바이트가 요청 된 경우에도 new 연산자가 올바른 포인터를 반환해야합니다. (이 이상한 소리가 필요하면 언어의 다른 부분이 단순화됩니다.)

“항목 51 : 새로 작성 및 삭제시 규칙 준수” 에서 Effective C ++ Third Edition 이 이와 같이 말했습니다.


답변

새로운 int [0]에서 테스트 한 이후 추가 공간이 필요하다는 것을 보증합니다.

예를 들어, 메모리 사용량

int **arr = new int*[1000000000];

보다 훨씬 작다

int **arr = new int*[1000000000];
for(int i =0; i < 1000000000; i++) {
    arr[i]=new int[0];
}

두 번째 코드 스 니펫의 메모리 사용량에서 첫 번째 코드 스 니펫의 메모리 사용량은 수많은 새로운 int [0]에 사용 된 메모리입니다.


답변