c++ delete[] 동적할당 해제에 대해서
글쓴이: minyoung347 / 작성시간: 월, 2015/08/10 - 11:43오전
#include <iostream> using namespace std; int main(void) { int* a = new int; *a = 1; cout<<a<<endl; delete[] a; cout<<*a<<endl; //cout<<b<<endl; return 0; }
위의 코드를 실행시키면 1과 0이 출력됩니다
제 생각에는 delete[] a;가 있어서 동적할당이 해제되어서
a라는 변수가 존재하지 않을 것 같은데(b를 출력하는 주석처리한 부분이 에러가 나듯이)
에러가 나지 않고 0이 출력됩니다
그 이유가 무엇인지요?
(ubuntu, g++ 사용하고 있습니다)
Forums:
a 라는 변수는??
일단 위에
a = 1;
이 코드 자체가 오류입니다;
a 는 포인터변수인데 a에 1이라는 정수를 대입하고있네요.
(*a) = 1;
을 하고싶으셨던건지요 ?
포인터를 삭제할경우에 디버거에서 null(0)값을 넣어주기 때문에 두번째 출력에는 0이 출력되나
디버그 모드가 아닐경우에는 값을 알 수 없습니다.
빠른 답변 감사합니다 실수했군요.. 실제로 할 때는
빠른 답변 감사합니다
실수했군요..
실제로 할 때는 (*a) = 1;이라고 했었습니다
그렇다면 a의 출력값이 0으로 나온다고 하여도
힙영역의 메모리에 손실은 없는 건가요?
동적할당 되었던 a가 차지하는 힙영역의 메모리에서
a가 delete로 제대로 없어진 것인지 궁금합니다
출력할때도
출력할때도
cout << (*a) << endl;
이렇게 해보세요..
메모리가 삭제된 후에는 분명 오류가 납니다 @_@
거기도 잘못됐었군요.. 죄송합니다 실제는 *a를
거기도 잘못됐었군요.. 죄송합니다
실제는 *a를 출력했는데 오류가 나지 않고 0이 출력됩니다
제가 생각하기에는 해당 메모리 영역의 값을 출력하는 것이기 때문에
delete를 해주면 해당 메모리에서 a값이 삭제되고
(모든 메모리에 기본적으로 0 저장)
다시 0으로 돌아가는게 아닌지 생각됩니다
제 생각이 틀린건지 알려주시면 감사하겠습니다
커널은 기본적으로 프로세스에게 페이지 단위(보통
커널은 기본적으로 프로세스에게 페이지 단위(보통 4KB)로 메모리 할당/해제를 해 줍니다. 변수 단위가 아니라요.
커널에게 페이지 단위로 메모리를 요청 한 후, 페이지를 잘게 쪼개서 관리해주는게
표준라이브러리의 malloc() 함수와 new 함수입니다.
또, new 하셨으면 delete 하셔야 합니다.
(delete [] 호출하시면 안됩니다. new []에 대응되는 함수입니다.)
해당 코드는 미정의 동작을 일으킵니다.
twinwings님 자세한 설명 감사합니다.
twinwings님 자세한 설명 감사합니다.
질문했던 것 이상으로 많이 배우고 갑니다.
댓글 달기