Visual Studio 에서 빌드 중 재미있는 현상을 하나 발견하였다.




위의 코드는 VS6.0 / VS 2005 / VS 2008 모두 디버그 모드에서는 Assertion Failed 에러를 보고하지만 Release 모드에서는 정상적으로 실행된다.

C++ 의 명저인 Effective C++ 의 항목 10 에서는 "new 를 썼을 때 delete 를 써라"(Item 10: Write operator delete if you write operator new. ) 는 내용을 명시하고 있다. 뭐 C++ 에 있어서 가장 기본적인 부분이라 할 수 있다.

위에서는 new 를 써서 동적으로 할당하지 않은 객체인 dat 를 delete 하려고 시도하고 있기 때문에 Visual Studio 컴파일러에서 Debug Assertion Failed 에러를 발생시킨다.  

사용자 삽입 이미지


이런 코드가 release 모드에서 정상적으로 실행되는 것도 이상하다. 하다못해 컴파일러가 warning 이라도 띄워주는 것이 맞지 않을까 싶다.
댓글을 달아주세요!
  1. BlogIcon hyperdash 2009.03.30 00:20 신고  댓글주소  수정/삭제  댓글쓰기

    호오... 정상적으로 실행이 된단 말이야?????

    혹시 컴파일러가 알아서 최적화 해서 제외시켜버린것은 아닐까???

    흠... 6.0 이 상위버젼보다 더 똑똑할리가 없지?

    • BlogIcon mynotepad 2009.04.05 21:21 신고  댓글주소  수정/삭제

      6.0 으로 개발한 프로그램으로 테스트 해 보면, 빌드시 에러없이 정상적으로 실행되지만 장기간 실행시 알수없는 런타임 에러와 함께 죽는 경우를 볼 수 있다.
      지금 돌이켜 보면 옛날에는 Visual Studio 6.0 으로 참 힘들게 개발을 했구나 싶다는...

  2. BlogIcon kuaaan 2009.08.04 00:04 신고  댓글주소  수정/삭제  댓글쓰기

    "Debug Assertion Failed" 는 디버그모드로 실행중에 ASSERT문에서 발생하는 오류 아닌지요...
    빌드시 발생하는 오류는 아닌것 같은데요... ^^;;

    • BlogIcon mynotepad 2009.08.04 18:33 신고  댓글주소  수정/삭제

      제가 표현을 좀 잘못했군요. "디버그 모드로 빌드시" 발생하는 오류입니다. ^^
      그런데 다시 테스트 해 보니 원본 글에 잘못이 있었습니다. 특별히 VS 6.0 만의 문제가 아니라 Visual Studio 6.0 / 2005 / 2008 모두 같은 증상을 보이는 문제네요...
      덕분에 본문을 수정했습니다. 감사합니다. ^^

이름 암호 홈페이지