> 백엔드 개발 > C++ > C에서 유효한 삭제된 포인터에서 파생된 포인터를 사용하고 있습니까?

C에서 유효한 삭제된 포인터에서 파생된 포인터를 사용하고 있습니까?

Linda Hamilton
풀어 주다: 2024-11-01 06:30:30
원래의
506명이 탐색했습니다.

Is using a pointer derived from a deleted pointer valid in C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿