작성
·
130
·
수정됨
0
#include <iostream>
using namespace std;
class AA {
public:
int _a = 10;
int _b = 50;
};
int main()
{
AA* A1 = new AA();
cout << A1 << endl;
delete A1;
cout << A1 << endl;
}
delete에 대해 궁금한게 있습니다!
만약 A1 값이 '0x0000026e88c13030' 일때, delete A1; 을 실행 후 A1값이 '0x0000000000008123' 로 바뀌어버렸습니다.
제가 알기로는 delete A1;을 하여도 비록 A1가 가리키는 힙메모리가 유효하지 않게 되고, 힙메모리가 쓰레기값으로 바뀌지만 그 메모리를 가리키는 A1('0x0000026e88c13030')는 여전히 유지된다고 알고 있습니다. 근데 저 코드를 여러번 해보아도 계속 '0x0000000000008123' <-- 일정한 이 값으로 바뀌어버립니다. (&A1는 컴파일을 할떄마다 새로운 값으로 바뀌는데 말이죠..ㅠ)
exercise_A 문제에서 'delete knight;' 를 했을 때에 knight값이 여전히 그대로인 것처럼, 위의 코드도 또한 그대로이겠지 하며 컴파일 하면 위처럼 예상과는 다른 결과가 나오는 이유가 무엇인가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
delete
연산자를 사용하여 동적으로 할당된 메모리를 해제한 후에 포인터 변수의 값이 변경되는 것을 관찰하셨군요. 일반적으로 delete
연산자를 사용하여 메모리를 해제하더라도, 포인터 변수 자체의 값이 자동으로 변경되거나 nullptr
이 되지는 않습니다. 즉, delete
후에도 포인터 변수는 여전히 해제된 메모리 주소를 가리키고 있게 됩니다. 그렇기 때문에 이후 포인터 변수를 사용하려면 반드시 nullptr
이나 다른 유효한 주소로 명시적으로 변경해 주어야 합니다.
포인터 변수의 값이 delete
후에 예상치 않게 변경되는 현상은 여러 가지 이유가 있을 수 있지만, 일반적인 경우는 아닙니다. 표준 C++의 동작상 delete
이후 포인터 값이 자동으로 변경되도록 정의된 것은 아니며, 보통은 개발 환경, 컴파일러의 최적화 과정, 혹은 기타 다른 요소들에 의한 부작용일 수 있습니다.
개발하시면서 delete
를 사용한 후에는 포인터를 nullptr
로 초기화하는 것이 안전한 프로그래밍 습관입니다.
delete A1;
A1 = nullptr;
이와 같이 설정하면, 메모리 해제 후에 포인터가 더 이상 유효하지 않은 메모리를 가리키지 않도록 할 수 있습니다. 또한 포인터가 nullptr
을 가리키고 있는지 확인함으로써 안전하게 포인터를 사용할 수 있게 됩니다.