일단 해결은 했음.
전체 코드 정리하기엔 너무 복잡해져서, 중요한 부분만 얘기하자면
기본적으로 Temp로 nMAX_LINE_CHARS+1 만큼 읽으면서
AllBuf의 크기를 늘리면서 덧붙이는 구조임.
---------------------------------------------------------------------------------------------------------
char* pszAllBuf = NULL;
char* pszTemp = new char[nMAX_LINE_CHARS + 1];
...
while(true){
..(1)
memset((void*)pszTemp, '\0', nMAX_LINE_CHARS + 1);
bReadData = (NULL != fgets(pszTemp, nMAX_LINE_CHARS + 1, m_pStream));
memcpy(pszTemp를 pszAllBuf로 복사)
..(2)
}
...
if (pszTemp) delete [] pszTemp;
---------------------------------------------------------------------------------------------------------
*최종적으로 pszAllBuf를 얻음
대충 이런구조임.(간단한 부분만 써놔서 뭔가 빠진거 같지만 대충 할건 다했음)
(쓰고보니 코드가 C++ 스타일이 아니긴 한데 new ~ delete가 문제니까 맞긴 함)
그런데 읽는게 줄단위인데
처음에는 괜찮은데
빈줄이 나타나는 순간 그 밑으로는 앞부분이 이상하게 다음 값으로 채워짐.
pszTemp는 멀쩡한데, 받는 변수가 이상해짐.
"니가 뭔가 이상하게 병신같이 짰겠지.."라고 생각하겠지?
저게 다른데서 받은 class 파일에 안에 새로 함수를 작성한건데,
새 함수니까 그대로 옮겨서 새로 테스트 프로젝트 만들어서 main 함수에서 돌리니까 멀쩡해짐.
프로젝트 옵션도 동일하게 맞췄고, 생기는 버그 자체가 일부 이상이기 때문에 옵션같은거 문제는 아님.
(옵션 문제면 전체가 비정상이 됨. 전체가 이상하면 오히려 오래 걸릴문제가 아님.)
적어도 논리적인 실수는 아마도 아닌거 같음.
나도 전체 코드 올리고는 싶은데,
저거 원인 찾는다고 테스트 코드 잔뜩 추가해서 주석 덩어리된 난장판 코드를 올리기도 싫고,
그걸 새로 정리하기도 귀찮음. 미안.
아차차,
해결한 방법을 얘길 한다는걸 깜빡했네.
두 가지가 있음.(둘 중 하나만 하면 됨)
1. 위에 while루프 속에 ..(1) ..(2) 자리에 아래 코드 추가해서 넣으니 해결
..(1) pszTemp = new char[nMAX_LINE_CHARS + 1];
..(2) delete [] pszTemp;
이렇게 하면 메모리 누수는 없는데, 루프 돌때마다 버퍼를 계속 새로 만든다는게 엿같음.
2. char* pszTemp = new char[nMAX_LINE_CHARS + 1];
->
char* pszTemp[nMAX_LINE_CHARS + 1] = {0,};
위와 같이 동적이 아닌 정적 배열로 만듬.
물론 저렇게 하니까 포인터 문제 생겨서 (char *) 로 캐스팅 필요한 부분은 다 했음.
delete [] pszTemp; 이거도 지우고.
동일한 코드에 딱 저 부분들만 바꾼거.
해법만 봐도 뭔가 논리적 문제는 아닌거 같지? ㅠㅠ
뭔가 배열에 lock을 걸어놓은 느낌임. 물론 멀티쓰레드 아님.
애초에 내가 논리적 구성을 잘못했으면 1,2번 해법과
main함수에 그대로 복제해서 해결되면 안되는 문제임 ㅠㅠ
아무튼 한 건 해결. ㅠㅠ
해당 댓글은 삭제되었습니다.
나도 이제와서 이런거 하기 싫은데 지금 하고 있는게 이런걸 요구해서 어쩔수가 없었음. 근데 그만큼 논리적으로도 간단하니 쉽고 가볍게 생각하고 금방 될거라 생각하고 시작한건데 이해할 수 없는 버그가 생기니 답답해서 골치였어요 ㅠㅠ CString이나 std string을 쓸 수 없는 상황임. ㅠㅠ