C언어 동적할당, 해제관련 질문입니다.
글쓴이: leeho330 / 작성시간: 월, 2017/11/20 - 3:18오후
안녕하세요.
코드는 아래와 같구요.
#include <stdio.h> #include <stdlib.h> int main(){ int numofData=100; int i, j, k; double **DistanceofDD; DistanceofDD=(double **)malloc(numofData*sizeof(double *)); for(i=0;i<numofData;i++){ DistanceofDD[i]=(double *)malloc(numofData*sizeof(double)); } for(j=0;j<numofData;j++){ for(k=0;k<numofData;k++){ DistanceofDD[j][k]=0; } } for(i=0;i<numofData;i++){ free(DistanceofDD[i]); } free(DistanceofDD); return 0; }
이 코드는 제가 짠 코드 전체가 아니라 문제를 설명하기위해 축약한 버전입니다. 위의 코드는 문제없이 작동하고 있습니다.
제 문제는 2차원배열을 할당, 값을 대입 그리고 사용한 뒤에 메모리를 해제할때 발생하고 있습니다.
2차원배열을 이중포인터로 동적할당을 한 경우 위 코드의 마지막 부분과 같이 for문을 사용해 하나씩 메모리할당을 해제하는 것으로 알고 있습니다.
그런데 제 코드에서 무슨 문제인지 특정 i값에 대응하는 메모리를 해제하려할 경우 프로그램이 에러를 일으킵니다.
예를 들면 i=0일때 free(DistanceofDD[0])를 실행하면 잘 되다가 i=1일때 free(DistanceofDD[1])을 실행하면 에러가 납니다.
i값을 바꿔가며 디버그해 봤을때 특정 몇개의 i값에서 오류가 나고 있습니다.
디버그를 하면서 오류가 발생하는 i번째의 메모리를 해제하면 다음과 같은 메시지가 출력됩니다.
Program received signal SIGTRAP, Teace/breakpoint trap.
제가 전문적으로 코딩을 배운게 아니라 물리학을 공부하다 수치해석적인 문제 해결을 위해 필요한 부분만 배우다 보니 에러가 발생할때 해결하기가 참 난감한 상황입니다.
좋은 지도 부탁드리겠습니다. 감사합니다.
Forums:
아래 질문과 유사한 문제입니다.
아래 질문과 유사한 문제입니다.
https://kldp.org/node/158555
free에서 문제가 난 것이 아니라, free 이전에 힙이 깨졌던 것이 free를 할 때 불거져 나온 것이죠.
정확히 어떤 시점에서 어떤 사유로 힙이 깨졌는지를 알아내려면 전체 코드를 살펴봐야 합니다.
상황을 분석하는 데 유용하게 쓸 수 있는 도구들도 있지요. (e.g., valgrind)
다만 힙 디버그는 조금 난이도가 있는 편인데, 관련 경험이 적으시면 좀 어려우실 겁니다. 주변에 도움을 청할 사람을 찾아보는 게 좋을지도 모르겠네요.
힙으로 할당받은 크기를 오버해서 메모리에 기록했을
힙으로 할당받은 크기를 오버해서 메모리에 기록했을 가능성이 크니까 그럴 가능성이 있는 부분부터 유심히 보시죠.
특히 루프를 돌면서 루프 변수의 범위를 잘못 지정하는 경우,
예를 들어 malloc(10 * sizeof(int)) 를 했으면 인덱스로 유효한값은 [0]부터 [9]까지인데 루프 변수 i 는 1부터 10까지 돌면서 [i] 자리에 뭔가를 쓴다거나,
i 는 분명히 0~9까지만 돌지만 루프 안에서 소팅을 하기 위해 [i+1] 과 바꿔치기를 하고 있다거나..
좋은 하루 되세요!
댓글 달기