문제

간단한 테스트 응용 프로그램:

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

출력:

0x876c0b8

그래서 작동합니다.무엇 표준에 대해 말 이?그것은 항상 법적 할당할""빈 블록의 메모리?

도움이 되었습니까?

해결책

5.3.4/7에서

직접 디코 레이터에서 표현식 값이 0 인 경우, 할당 함수는 요소가없는 배열을 할당하도록 호출됩니다.

3.7.3.1/2에서

제로 크기에 대한 요청으로 반환 된 포인터를 반환하는 효과는 정의되지 않았습니다.

또한

신규]가 요청한 공간의 크기가 0이더라도 요청이 실패 할 수 있습니다.

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

여기에 흥미로운 발자음이 있습니다 (즉, 표준의 규범적인 부분은 아니지만 해설 목적으로 포함)는 3.7.3.1/2의 문장에 첨부됩니다.

32. 의도는 Malloc () 또는 Calloc ()를 호출하여 Operator New ()를 구현할 수 있도록하는 것이므로 규칙은 실질적으로 동일합니다. C ++는 널이 아닌 포인터를 반환하기 위해 제로 요청을 요구하는 경우 C와 다릅니다.

다른 팁

그렇습니다. 이와 같이 제로 크기의 배열을 할당하는 것은 합법적입니다. 그러나 당신은 또한 그것을 삭제해야합니다.

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

모든 객체에는 고유 한 신원이 있습니다. 즉 고유 주소는 0이 아닌 길이를 의미합니다 (실제 메모리 양은 제로 바이트를 요구하면 조용히 증가합니다).

이 객체 중 하나 이상을 할당하면 주소가 다릅니다.

네,그것은 완전히 할당 0 이즈 블록 new.당신은 단순히 아무것도 할 수 없습 유용한 그것이 없기 때문에 유효한 데이터에 대한 액세스가 가능해집니다. int[0] = 5; 는 것은 불법입니다.

그러나 믿는 표준을 허용 같은 것들 malloc(0) 로 돌아 NULL.

당신은 여전히 필요 delete [] 어떤 포인터에서 돌아올의 할당뿐만 아니라.

흥미롭게도 C ++는 0 바이트가 요청 되더라도 운영자 New가 합법적 인 포인터를 반환해야합니다. (이 이상한 소리를내는 행동이 필요하면 언어의 다른 곳에서는 단순화됩니다.)

나는 찾았다 효과적인 C ++ 제 3 판 "항목 51 : 신규 앤 삭제를 쓸 때 컨벤션을 준수"에서 이렇게 말했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top