>백엔드 개발 >C++ >C에서 포인터가 삭제된 후 동일한 객체를 참조하는 포인터는 어떻게 되나요?

C에서 포인터가 삭제된 후 동일한 객체를 참조하는 포인터는 어떻게 되나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-01 11:29:30852검색

What Happens to Pointers Referencing the Same Object After One is Deleted in C  ?

C에서 해제된 메모리에 대한 포인터

포인터를 삭제한 후 동일한 객체를 참조하는 다른 포인터의 유효성과 관련하여 혼란이 발생합니다. 이 문서의 목적은 C에서 이 동작을 명확히 하는 것입니다.

다음 코드를 고려하세요.

<code class="cpp">A* a = new A();
A* b = a;

delete a;

A* c = a; // Illegal (C++11)
A* d = b; // Debatable legality

// Points to deallocated memory, Undefined in C++11
A* aAddr = &a;</code>

C 11 동작:

  • 할당 a는 이제 잘못된 포인터 값이므로 이전에 삭제된 포인터 a에서 c로 이동하면 정의되지 않은 동작이 발생합니다.
  • 그러나 d는 삭제 전에 만들어진 a의 복사본을 가리킵니다. b 값을 읽는 것은 할당 해제된 메모리 위치를 가리키지만 이 작업은 구현에 따라 정의됩니다.

C 14 동작:

  • 다음에 할당 유효하지 않은 포인터 a의 c와 d 모두 여전히 정의되지 않은 동작을 발생시킵니다.
  • 여기서 b와 같이 유효하지 않은 포인터의 값을 복사하는 것도 구현에 따라 정의된 동작입니다.

C 11 표준에 따르면 잘못된 포인터 값을 사용하면(복사 포함) 정의되지 않은 동작이 발생합니다. C 14에서는 이러한 작업에 구현 정의 동작이 있습니다. 즉, 동작은 컴파일러와 운영 체제에 따라 다를 수 있습니다.

따라서 C 11과 C 14 모두에서 다음과 같은 포인터를 사용하지 않는 것이 중요합니다. 삭제되거나 할당 해제된 메모리를 참조합니다. 그렇게 하면 예측할 수 없고 잠재적으로 잘못된 동작이 발생할 수 있습니다.

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

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