C++의 댕글링 포인터
이 기사에서는 댕글링 포인터가 무엇인지 설명합니다.
C++의 댕글링 포인터
매달린 포인터는 더 이상 존재하지 않는 개체에 대한 포인터(참조)입니다. 개체가 삭제되면 포인터는 이전에 있던 메모리 주소를 가리킵니다.
매달린 포인터는 유효한 데이터를 가리키지 않으며 쓸모가 없습니다.
댕글링 포인터는 프로그래머가 개체에 대해 이전에 할당된 메모리 공간을 삭제하는 것을 잊었을 때 발생할 수 있습니다. 이는 프로그래머가 너무 많은 메모리를 할당하고 필요한 모든 개체에 대해 충분한 공간이 남아 있지 않아 더 많은 공간을 할당하고 첫 번째 할당을 잊어버린 경우에 발생할 수 있습니다.
이 오류는 두 개의 포인터가 동일한 메모리 주소를 가리키고 그 중 하나가 액세스를 시도할 때 프로그램 충돌을 일으킬 수 있습니다.
매달린 포인터는 힙에서 메모리가 누출되기 때문에 메모리 누출이라고도 합니다. 힙은 동적 데이터가 상주하는 메모리 영역이며 프로그래머가 필요에 따라 할당하거나 할당을 취소할 수 있습니다.
C++에서 댕글링 포인터의 간단한 예
댕글링 포인터는 모든 종류의 예측할 수 없는 동작을 유발할 수 있기 때문에 위험합니다.
일반적인 예는 매달린 포인터가 시간이 지남에 따라 다른 데이터 조각이 배치된 메모리 영역을 가리키는 경우입니다. 댕글링 포인터가 생성된 후 변경된 목록의 값을 예로 들 수 있습니다.
이런 일이 발생하고 매달린 포인터가 역참조되면 대신 이 새 값에 액세스하여 예측할 수 없는 동작을 일으킵니다.
댕글링 포인터 문제는 원시 포인터 대신 스마트 포인터를 사용하여 종종 피할 수 있습니다. 스마트 포인터는 원시 포인터와 동일한 인터페이스를 제공하지만 스마트 포인터가 범위를 벗어나 사용하는 리소스를 해제하면 가리키는 개체를 자동으로 삭제하는 클래스입니다.
댕글링 포인터의 예제 코드에 대해 논의해 봅시다.
#include <iostream>
using namespace std;
int main() {
int *pointer = new int;
*pointer = 90;
delete pointer;
cout << pointer << endl;
}
위의 코드에서 본 것처럼 동적 메모리 위치를 포인터 변수에 할당하고 90
을 저장했습니다.
다음 줄에서 delete
연산자를 사용하여 동적 메모리를 삭제했지만 pointer
변수는 여전히 동적 메모리를 가리킵니다. 이것이 댕글링 포인터입니다.
위 코드의 작동을 확인하려면 여기를 클릭하십시오.
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook