>백엔드 개발 >C++ >원본이 삭제된 후 C에서 복사된 포인터는 어떻게 되나요?

원본이 삭제된 후 C에서 복사된 포인터는 어떻게 되나요?

DDD
DDD원래의
2024-11-01 15:13:02372검색

What Happens to Copied Pointers in C   After the Original is Deleted?

삭제 후 C의 포인터

C에서 다음 코드 조각을 고려하세요.

<code class="cpp">A* a = new A();
A* b = a;
delete a;
A* c = a; // Undefined behavior in C++11
A* d = b; // Potentially legal, but uncertain</code>

이 코드는 질문: 원래 포인터가 삭제된 후 복사된 포인터의 값에 액세스하면 어떻게 되나요?

C 11에서 삭제된 포인터의 값에 액세스하면 정의되지 않은 동작이 발생합니다. 이는 포인터 a와 b 모두에 적용됩니다. a의 값을 c에 복사하는 것도 할당 해제된 메모리를 가리키는 점으로서 정의되지 않습니다.

그러나 C 14에서는 동작이 구현에 따라 정의됩니다. 표준에서는 다음과 같이 지정합니다.

"잘못된 포인터 값을 통한 간접 참조 및 할당 해제 함수에 잘못된 포인터 값을 전달하는 것은 정의되지 않은 동작을 갖습니다. 잘못된 포인터 값을 다른 방식으로 사용하는 경우에는 구현에 따라 동작이 정의됩니다."

따라서 C 14에서는 a의 복사본인 b 값에 ​​액세스하는 것도 구현에 따라 정의됩니다. 잠재적으로 정의되지 않은 동작이 발생할 수 있지만 특정 구현에 따라 다르게 처리될 수도 있습니다.

요약하면 둘 다 A* c = a; 그리고 A* d = b; C 11에서는 정의되지 않았고 C 14에서는 구현에 정의되어 있습니다. 이는 포인터 a와 b 모두 삭제 작업 후 잘못된 메모리를 가리키기 때문입니다.

위 내용은 원본이 삭제된 후 C에서 복사된 포인터는 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.