문제

피어 코드 리뷰 세션에서 아래와 같이 코드를 보았습니다.

char *s = new char[3];
*s++ = 'a';
*s++ = 'b';
*s++='\0';
delete []s; // this may or may not crash on some or any day !!

첫째, 표준 C ++에서 일회성을 가리키는 것은 배열 크기를 가리키면 정의되지 않은 동작을 초래하지만 액세스 할 수 있습니다. 그래서 나는 마지막 줄을 믿습니다 *s++='\0' 괜찮습니다. 그러나 내가 올바르게 기억한다면 C ++ 표준은 delete 동일한 포인터를 제공해야합니다 new 반환.

이것은 반환 된 포인터가 훼손되어서는 안된다는 것을 의미합니다. 나는 그 때문이라고 생각합니다 new 반환 된 주소 전에 하우스 키핑 정보를 보관할 수 있습니다. delete 사용할 수 있습니다. 이동 new'D 포인터는 이것을 접근 할 수 없게 만들 수 있습니다.

정의되지 않은 동작 또는 구현이 정의되지 않거나 지정되지 않습니까? 누구든지 이것을 확인할 수 있습니까? 바람직하게는 C ++ 표준의 올바른 장소를 가리키는 것이 바람직합니다.

C ++ 표준 초안의 무료 드래프트 버전 (draft_sc22-n-4411.pdf)의 드래프트 버전에는 5.3.5 절에 세부 사항이 있습니다. 나는 Bjarne의 홈페이지에서 그것을 얻었습니다.

도움이 되었습니까?

해결책

C ++ 표준에서 섹션 5.3.5/2 :

삭제의 피연산자 값은 이전 배열 새 발현에서 발생한 포인터 값이어야합니다. 그렇지 않다면 행동이 정의되지 않습니다

다른 팁

예, 신규가 제공 한 원래 포인터를 삭제해야합니다. 이 경우, 그것은 꼬리가 아닌 배열의 헤드에 대한 포인터입니다. 여기의 코드는 지정되지 않은 다른 임의의 개체를 삭제하고 있습니다.

예, 이것이 어떻게 구현되는지 기억하십시오. New는 실제로 Malloc이라고 부릅니다. (void*)(&(((int*)p)[1])), 여기서 P는 할당 된 메모리의 실제 시작이며, 첫 번째 int는 우리가 돌아온 실제 메모리의 크기입니다.

우리가 돌아 오는 포인터는 할당 된 실제 메모리에서 (int)의 한 크기 (또는 정렬이 필요한 모든 정렬)입니다. 우리는 그곳에 물체를 내려 놓고 실제 크기를 방해받지 않습니다.

그런 다음 해당 포인터가 삭제로 전달되면 무료로 전달됩니다. ~ 전에 통과 된 포인터는 거슬러 올라가는 크기를 찾습니다.

우리가 얻은 것 이외의 다른 것을 뒤로 물러서면 자유의 양의 실제 메모리가 다시 전달되고 있다고 생각하고 그에 따라 무료 목록을 망칠 것임을 의미합니다.

다시 말하지만, 이것이 방법입니다 자주 새로운, 삭제, malloc 또는 무료가 아닌 구현이 구현되어야합니다.

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