포인터(pointer)는 메모리 주소를 저장하는 변수입니다. 그렇다면 와일드 포인터(wild pointer)는 무엇이 다를까요? 와일드 포인터 역시 메모리 주소를 저장하지만, 할당되지 않은 메모리 공간이나 이미 해제된 데이터 값을 가리킨다는 점에서 일반 포인터와 구별됩니다.
가장 흔한 경우는 포인터가 선언만 되고 초기화되지 않았을 때입니다. 초기화하지 않은 포인터는 쓰레기 값을 담고 있어 임의의(random) 메모리 위치를 가리키게 되며, 이러한 포인터에 접근하면 프로그램이 비정상적으로 동작하거나 세그먼트 오류(segmentation fault)로 종료될 수 있습니다.
예제
#include <bits/stdc++.h>
using namespace std;
int main() {
int *arr;
for(int i=0; i<5; i++)
cout << arr[i] << " ";
return 0;
}
출력 결과
1 0 -426634956 32764 0
위 프로그램에서 포인터 arr는 선언만 되었을 뿐 초기화되지 않았습니다. 따라서 arr가 가리키는 메모리 위치는 전혀 예측할 수 없으며, 출력 결과 역시 실행할 때마다 달라지는 임의의 값들이 표시됩니다.
int *arr; for(int i=0; i<5; i++) cout << arr[i] << " ";
와일드 포인터를 피하는 방법
와일드 포인터로 인한 오류를 예방하려면 다음과 같은 코딩 습관이 도움이 됩니다.
- 포인터를 선언하는 즉시
nullptr(C++11 이상) 또는NULL로 초기화합니다. - 동적으로 할당한 메모리는 사용이 끝난 후 반드시 해제하고, 해제한 뒤에는 포인터를
nullptr로 설정해 댕글링 포인터(dangling pointer)가 되지 않도록 합니다. - 포인터를 역참조하기 전에 유효한 주소를 가리키고 있는지 항상 확인합니다.