답변:
Stroustrup 자신이 대답합니다. 발췌 :
C ++은 delete 구현이 lvalue 피연산자를 제로화 할 수 있도록 명시 적으로 허용하며 구현에서 그렇게하기를 희망했지만 그 아이디어는 구현 자에게 인기가없는 것으로 보입니다.
그러나 그가 제기하는 주요 문제는 delete의 인수가 lvalue 일 필요는 없다는 것입니다.
먼저 null로 설정하려면 메모리 저장 변수가 필요합니다. 일반적으로 변수에 포인터가 있지만 때로는 계산 된 주소에서 객체 를 삭제 하려고 할 수도 있습니다 . "nullifying"삭제로는 불가능합니다.
그런 다음 성능이 제공됩니다. 삭제 가 완료된 직후 포인터가 범위를 벗어나는 방식으로 코드를 작성했을 수 있습니다 . null로 채우는 것은 시간 낭비입니다. 그리고 C ++는 "필요하지 않습니까? 그렇다면 돈을 지불 할 필요가 없습니다"라는 이념이있는 언어입니다.
안전이 필요한 경우 서비스에 광범위한 스마트 포인터가 있거나 더 좋고 똑똑한 자신만의 글을 쓸 수 있습니다.
delete (ptr + i)
해당 메모리를 가리키는 포인터가 여러 개있을 수 있습니다. 삭제에 지정한 포인터가 null로 설정되었지만 다른 모든 포인터가 그렇지 않은 경우 잘못된 보안 감각을 만듭니다. 포인터는 주소, 숫자에 지나지 않습니다. 역 참조 작업이있는 int 일 수도 있습니다. 내 요점은 모든 단일 포인터를 스캔하여 방금 삭제 한 동일한 메모리를 참조하는 포인터를 찾아서 null을 제거해야한다는 것입니다. 해당 주소에 대한 모든 포인터를 스캔하고 언어가 설계되지 않았기 때문에 null을 계산하는 것은 계산 상 강렬합니다. (일부 다른 언어는 비슷한 방식으로 다른 목표를 달성하기 위해 참조를 구성합니다.)
C ++를 사용하면 자신 만의 연산자를 새로 정의하고 삭제할 수 있으므로 예를 들어 자신의 풀 할당자를 사용할 수 있습니다. 이렇게하면 엄격하게 주소가 아닌 풀 배열의 인덱스라고하는 항목으로 new를 사용하고 삭제할 수 있습니다. 이와 관련하여 NULL (0) 값은 올바른 의미를 가질 수 있습니다 (풀의 첫 번째 항목 참조).
따라서 delete NULL을 인수에 자동으로 설정한다고해서 항상 의미가있는 것은 아닙니다. 값을 유효하지 않은 값으로 설정하십시오. 유효하지 않은 값이 항상 NULL 인 것은 아닙니다.
포인터를 자동으로 NULL로 설정하면 잘못된 포인터 사용과 관련된 대부분의 문제가 해결되지 않습니다. 피할 수있는 유일한 충돌은 두 번 삭제하려고하는 것입니다. 그러한 포인터에서 멤버 함수를 호출하면 어떻게됩니까? 멤버 변수에 액세스한다고 가정하면 여전히 충돌합니다. C ++은 NULL 포인터에서 함수를 호출하는 것을 제한하지 않으며 성능 관점에서 수행해서는 안됩니다.
사람들이이 질문에 이상한 답을주는 것을 봅니다.
ptr = NULL; 그러한 간단한 진술이 어떻게 성능 지연을 일으킬 수 있습니까?
또 다른 대답은 동일한 메모리 위치를 가리키는 여러 개의 포인터를 가질 수 있다는 것입니다. 분명히 우리는 할 수 있습니다. 이 경우 하나의 포인터에서 삭제 작업을 수행하면 해당 포인터 만 NULL이되고 (삭제가 포인터를 NULL로 만든 경우) 다른 포인터는 NULL이 아니며 사용 가능한 메모리 위치를 가리 킵니다.
이에 대한 해결책은 사용자가 동일한 위치를 가리키는 모든 포인터를 삭제해야한다는 것입니다. 내부적으로 메모리가 여유 공간보다 이미 비어 있는지 확인해야합니다. 포인터를 NULL로만 만드십시오.
Stroustrup은 이러한 방식으로 작동하도록 삭제를 설계했을 수 있습니다. 그는 프로그래머들이 이것을 처리 할 것이라고 생각했다. 그래서 그는 무시했다.