< 릴리즈 모드에서 에러가 발생하는 경우 >

디버그 모드로 프로그램을 작성해 컴파일한 후 실행하면 제대로 실행되는데, 릴리즈 모드로 컴파일한 후 실행하면 프로그램이 시작하기도 전에 죽어 버립니다. 디버그 모드에서는 결과값이 정상으로 나오는데, 릴리즈 모드에서 이런 현상이 발생하는 이유가 무엇일까요.

질문한 내용은 비주얼 C++의 경우 최적화 기능 때문에 발생하는 것입니다. 다음 소스를 보세요.

for(i=0; i<10; i++) {
    j=3;
    printf(“%d”, i);
}

별 문제 없는 소스지만 디버그 모드로 컴파일 할 때와 릴리즈로 컴파일 할 때 큰 차이를 보입니다. 디버그 모드일 때는 해당 소스를 그대로 컴파일하지만, 릴리즈 모드일 경우 최적화 옵션이 켜 있다면 소스가 다음과 같이 바뀝니다.

j=3;
for(i=0; i<10; i++) {
    printf(“%d”, i);
}

 앞의 소스에서 보다시피 j는 for문 내에 있을 필요가 없기 때문입니다. 속도만 느려지는 원인이 되기 때문에 최적화 기능에서 소스가 변하는 것입니다. 최적화 기능을 없애려면 다음과 같이 하세요. 프로젝트의 Settings을 선택한 후, C/C++ 탭을 선택하면 우측편에 Optimizations가 있습니다. 이것을 Disable(Debug)로 선택하면 됩니다. 참고로 릴리즈 모드로 컴파일하되 디버깅해 보는 방법을 알려 드리겠습니다.

Win32 Release로 선택한 후 Settings에서 C/C++ 탭을 선택한 후 Debug info를 프로그램 데이터베이스로 선택합니다.

링크 탭에서 Generate debug info를 선택한 후 Rebuild All한 다음 디버그처럼 F10, F11키를 적절히 사용해 보세요. 디버깅을 할 수 있을 겁니다.

 

< 여러 줄에서 한 줄씩 차례로 읽는 방법 >

CString 객체가 \r을 많이 포함하고 있을 때, 즉 여러 줄로 구성돼 있을 때 한 줄씩 차례로 읽어 들이는 방법이 없나요? 을 찾은 후 거기까지 for loop 돌려서 getat으로 substring을 뽑고 그 substring 지우고…. 이런 식으로는 구현할 수 있겠는데 설마 코드를 이런 식으로까지 짜야 하는지요.

CString 객체에는 한 줄씩 읽어드리는 멤버가 없습니다. 다음과 같이 소스를 구성하기 바랍니다.

int nHead=0, nTail=0;

while (1) {
    nTail = strData.Find(nHead, ‘’);
    if (nTail == -1)
         break;
    strTemp = strData.Mid(nHead, nTail-nHead);
    nHead = nTail + 2;
}

- this is the end of this file -