tngusqkr1   5년 전

안녕하세요 고수님들!

44번째 줄과 66번째 줄에 Tomato *t, Tomato *newT를 선언하고 각각 50번째, 81번째 줄에서 계속 갱신하며 queue에 넣어주는데요,

동적 할당이라 마지막에서 delete t, delete newT를 했는데 crtIs valid heap pointer라는 런타임 에러가 뜹니다ㅠㅠ

무슨 문제일까요?

그리고, delete를 하지 않으면 메모리가 40000KB 이상이 잡히던데 왜 그런 걸까요?ㅠㅠ


감사합니다!!!!!!!!!!!!

djm03178   5년 전

동적 할당에 대해 좀 오해를 하시는 것 같습니다.

newT라는 것은 그저 포인터 변수일 뿐이고, delete newT를 했을 때 해제되는 메모리는 newT가 그 시점에서 가리키고 있는 메모리인 것입니다.

예를 들어 81번째 줄이 3번 실행되면서 newT가 각각 100, 200, 300이라는 메모리 주소를 할당받았다면, 마지막에 들어간 300이라는 주소만이 delete newT에서 해제되는 것이고 100, 200에는 아무런 영향이 없는 것입니다.

게다가 81번째 줄이 한 번도 실행되지 않는다면, 즉 특정 토마토의 주변으로 익어나갈 일이 없는 케이스라면 newT에는 아무런 주소를 할당해준 적이 없으므로 95번째 줄은 쓰레기 주소를 해제하려고 시도하는 것이 됩니다.

동적 할당받은 메모리를 모두 해제하고 싶다면 큐에서 빠진 원소들 모두에 delete를 각각 적용해주어야 하는 것이고, 이를 하든 안 하든 메모리 사용량이 줄지는 않을 것입니다. 최악의 경우 큐에는 어쨌든 최대 100만개의 원소가 한 순간에 들어가있을 수 있고, 여기서 사용하는 메모리가 그 정도가 되기 때문입니다. 지나치게 많은 것이 아니고 지극히 정상입니다. 메모리 사용량을 줄이고 싶다면 포인터 대신에 객체 자체를 큐에 넣고, constructor도 만들지 말고 day 멤버를 없애고 푸는 방법 등을 사용할 수는 있습니다.

tngusqkr1   5년 전

와... 감사합니다ㅠㅠㅠㅠ

포인터와 동적 할당에 대해 다시 공부해야겠습니다ㅠㅠㅠ

감사합니다!!!!ㅎㅎㅎㅎ

댓글을 작성하려면 로그인해야 합니다.