작성
·
407
9
안녕하세요.
취미로 코딩을 배우고 있는 한 학생입니다.
다름이 아니라 강의를 보면서 따라해보고 있는데 강의 상의 결과와 실제로 따라해본 결과가 다른 문제가 발생했습니다.
강의에서는 포인터 ptr을 new int{7}로 초기화(동적할당?)하고 난 뒤 주소값과 delete ptr; 로 메모리를 반납한 뒤의 ptr의 주소값이 같습니다.
하지만 제가 직접 따라해보니 전혀 연관성 없어보이는 주소값을 가지고 있더라구요. 게다가 de-reference의 값도 -5726... 같은 쓰레기 값이 아닌 아무 것도 출력이 되지 않습니다.
왜 이런 결과가 나오게 된걸까요? 분명이 같은 코드인데 막상 다른 결과가 나오니 무엇이 문제인지 모르겠습니다.
이하 코드와 결과입니다.
#include <iostream>
using namespace std;
int main()
{
int* ptr = new int{ 7 }; // OS로부터 int에 해당하는 4bytes의 메모리를 받아 옴
cout << ptr << endl;
cout << *ptr << endl;
delete ptr; // OS로 해당 메모리를 반납
cout << "After delete" << endl;
cout << ptr << endl;
cout << *ptr << endl;
return 0;
}
01230578
7
After delete
00008123
답변 2
18
안녕하세요? 취미로 C++을 공부하시다니 보통 분은 아니신 것 같습니다. 질문도 중요한 내용을 문의해주신 것 같은데, 원래는 delete한 후에는 들여다보지도 않는 것이 정석입니다. 제가 자세하게 설명하려다가 오히려 혼란을 드린 것 같네요. 지금 실습하시는 내용에 문제가 있는 것은 아닙니다.
질문해주신 덕분에 저도 공부삼아 찾아봤는데, visual studio에서 pointer를 delete한 후에 '청소'를 해준다고 합니다. 00008123은 우연히 나온 숫자가 아니라 visual studio에서 사용하는 컴파일러가 의도적으로 "Automated pointer sanitization when deleting C++ objects".을 해준 것이라고 합니다. 컴파일러 옵션에서 끌 수도 있다고 하네요.
취미 치고는 깊게 공부하시는 것 같지만 아주 제대로 공부하고 계신 것 같습니다. 이후 강의에서도 높은 성취 올리시기를 기원합니다.
0