디버그 원인 분석 공개 모집중

onacloud Reply 9 years 6 weeks ago
char **arr = new char*[n]; for (int i = 0; i < n; i++){ arr[i] = new char[m]; } 이부분에 문제가 있습니다. 얼핏 보면 연속된 메모리 공간 같지만, heap 영역에 만드므로, arr[i]와 arr[i+1]은 서로 이어져 있지 않습니다. 실제로 주소값을 살펴보면 m이 22라고 하더라도 arr[i]와 arr[i+1] 사이에는 32byte 차이가 있습니다. (이부분이 운영체제 마다 달라서, linux에서는 문제가 되지만, window에서는 문제가 안됩니다.) 이러한 차이가 영향을 끼치는 부위는 아래입니다. void RemoveLake(bool **arr, int i, int j){ 이 함수 정의에 따르면 arr은 연속된 공간이므로, 에러가 발생하는 것이지요.
booksky Reply 9 years 6 weeks ago
C에서 farm = (char**)calloc(sizeof(char*), height); for(cnt = 0 ; cnt < width ; cnt++) farm[cnt] = (char*)calloc(sizeof(char), width); 이런 식으로 allocate할 때는 문제가 없었는데 C++에서만 저런 문제가 발생하는건가요?
onacloud Reply 9 years 6 weeks ago
1번 소스코드와 3번 소스코드를 윈도우에 실행하면 정상적으로 작동되 올바른 값이 나옵니다. 하지만, 두 소스를 제출하면 둘다 wrong answer가 나오게 되죠. 이것은 운영체제의 메모리 할당과 관련있어 보입니다. withcs가 돌아가는 linux kernel의 경우 메모리 공간의 효율적인 관리를 위해 new, calloc, malloc 등으로 할당되는 공간의 크기를 16의 배수로 관리하고 있는 것으로 예측됩니다.