C에서 삭제 후 포인터: a와 b의 난처한 사례
C 포인터의 세계에서 할당된 포인터를 삭제하는 행위 삭제를 통한 메모리는 해당 메모리를 가리키는 포인터의 유효성에 대한 의문을 제기합니다. 다음 시나리오를 고려하십시오.
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // illegal in C++11 A* d = b; // legal?</code>
질문의 핵심은 a가 삭제된 후 포인터 b의 값을 사용하는 것이 유효한지 결정하는 것입니다.
의 운명 잘못된 포인터: C 11의 정의되지 않은 동작, C 14의 구현 정의
C 11에서 삭제된 포인터(a)의 값에 액세스하면 정의되지 않은 동작이 발생합니다. 그러나 삭제된 포인터에서 파생된 포인터(b)를 사용하면 미묘한 상황이 발생합니다.
C 11에서는 둘 다 c = a; 그리고 d = b; 정의되지 않은 동작으로 간주됩니다. 이는 a와 b가 모두 할당 해제된 저장소를 가리키므로 "잘못된 포인터 값"으로 간주되기 때문입니다. 유효하지 않은 포인터에 대한 작업을 수행하려는 모든 시도는 명시적으로 정의되지 않습니다.
C 14의 구현 정의 복잡성
C 14에서는 이 시나리오에 미묘한 변경 사항을 도입합니다. 개정된 표준에 따르면 "잘못된 포인터 값을 사용하는 것"에는 "값을 복사하는 것"이 포함됩니다. 따라서 C 14에서는 c와 d에 대한 할당이 모두 구현 정의로 간주됩니다.
이 변경의 이유는 잘못된 포인터 값을 복사하면 잠재적으로 특정 구현에서 런타임 오류가 발생할 수 있기 때문입니다. 표준은 적절하다고 판단되는 경우를 처리하기 위해 구현에 현명하게 맡깁니다.
결론적으로, a를 삭제한 후 b를 사용하는 것이 합법성은 사용되는 C 버전에 달려 있습니다. C 11은 c = a로 간주합니다. 그리고 d = b; 정의되지 않은 동작, C 14는 책임을 구현으로 옮기고 결과는 표준에 지정되지 않은 상태로 둡니다.
위 내용은 C에서 유효한 삭제된 포인터에서 파생된 포인터를 사용하고 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!