범위 밖의 지역 변수 메모리에 액세스할 수 있는 예를 살펴보겠습니다.
예시
#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }
출력
이것은 다음과 같은 결과를 줄 수 있습니다 -
3 12
이전에 언급했듯이 이 코드는 작동할 수도 있습니다. 우리는 단순히 x의 주소로 사용되었던 메모리를 읽고 쓰고 있습니다. 기본적으로 foo의 범위 밖에 있으며 주소는 임의의 메모리 영역에 대한 포인터입니다. 위의 예에서 해당 메모리 영역은 존재하며 현재 다른 어떤 것도 사용하고 있지 않습니다. 계속해서 사용하면 아무 것도 손상되지 않으며(다른 프로세스의 메모리 영역이나 다른 승인되지 않은 메모리 영역을 사용하지 않을 것입니다), 다른 어떤 것도 아직 덮어쓰지 않았습니다. 따라서 3은 여전히 존재합니다.
실제 프로그램에서 그 메모리는 거의 즉시 재사용되었을 수 있으며 이렇게 하면 무언가를 깨뜨릴 수 있습니다. 이러한 메모리 액세스 버그는 추적하고 제거하기가 매우 어렵습니다.
foo에서 돌아오면 프로그램은 x의 메모리가 더 이상 사용되지 않고 다른 메모리에 재할당될 수 있다고 OS에 알립니다. 운이 좋으면 재할당되고 OS에서 다시 사용하는 것을 포착하지 못하면 사용하지 않아도 됩니다.