delete 와 관련하여 질문이 있습니다.
#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을 가리키고 있는지 확인함으로써 안전하게 포인터를 사용할 수 있게 됩니다.
소스코드와 관련하여 질문드립니다
0
70
1
map 컨테이너의 emplace 함수에 대해
0
112
2
시작이 안되네요...!
0
96
2
EAX 명령어 실행 시 RAX의 상위 32비트가 초기화 되는 이유
0
125
1
리틀 엔디안 장점 질문합니다.
0
131
1
메모리 창에 주소를 넣었는데 영어 꺠짐
0
124
1
타입변환#2 build시 knight 인접 stack이 침범당했다는 error가 발생합니다.
0
94
2
map #1 8분 58초 맵은 레드블랙트리로 이루어진 것 같습니다.
1
138
2
hello world 부터 오류 ㅠㅜ
0
188
1
지역변수가 스택? 레지스터
0
127
2
마지막 문제 질문드립니다.
0
163
2
메모리창이 비활성화됩니다.
0
98
1
이중포인터 강좌 부분 질문있습니다.
0
145
1
2를 더하는 이유
0
133
1
메모리 주소 창 엔디안 질문 드립니다. 인프런 봇 답변도 괜찮습니다
1
110
1
해당 코드는 왜 오류가 날까요?
0
154
1
마지막 문제 질문 있습니다.
0
118
1
강의 마지막부분에 질문이 있습니다.
0
190
2
Field초기화
0
140
1
virtual과 override 차이
0
314
2
3:30 참조자 리턴
0
166
1
map 찾기
0
157
1
프로그램 질문드려요
0
258
1
캐스팅 질문
0
137
1





