초기화 그리고 delete...
2006/10/24 14:00

다른 동료가 코딩한 프로그램에 코드 몇줄 추가하고 실행했더니...
CodeProject에 있는 소스코드란다...
이상하게 자꾸 메모리쪽에 ASSERT 에러가 발생하길래...(전혀 메모리쪽은 건들지도 않았는데...)
Debugging을 해봤더니...
이런 경우도...

  1. class CBabo
  2. {
  3. public:
  4.   CBabo();
  5.   CBabo(int i);
  6.   ~CBabo();
  7. private:
  8.   char*    m_babo;
  9. }
  10. CBabo::CBabo()
  11. {
  12.   m_babo= NULL;
  13. }
  14. CBabo::CBabo(int i)
  15. {
  16.   if(i==1)
  17.        some_function(); // m_babo에게 new pointer 할당...
  18.   else
  19.        m_babo= NULL;
  20. }
  21. CBabo::~CBabo()
  22. {
  23.   if (m_babo != NULL)
  24.   {
  25.        delete m_babo;
  26.       m_babo= NULL;
  27.   }
  28. }

some_function()에서 당연히 멤버변수 m_babo가 new 로 point를 할당하는데...
어쩌다 할당하지 못하는 경우가 드물게 발생...
그럴경우 m_babo는 초기화 되지 못하고 쓰레기값이 들어가 있는 상태에서 소멸자에서 m_babo 는 NULL 이 아니므로 할당되지 못한 메모리를 delete 함으로 에러 발생...

가장 좋은 초기화 방법으로는...
CBabo::CBabo() : m_babo(NULL)
참고서적으로는 이펙티브 C++...

오전 반나절을 시간낭비 했지만...
초기화 우습게 볼게 못되는군...

2006/10/24 14:00 2006/10/24 14:00
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/10/25 08:26  댓글주소  수정/삭제  댓글쓰기
    m_pVersionInfo = NULL;

    //<- 이것도 에러. ㅋㅋ
  • duck 2006/10/25 16:04  댓글주소  수정/삭제  댓글쓰기
    저는 프로그램은 모르지만..

    babo... 만 눈에 들어와요~ ㅋㅋㅋ
  • duck 2006/10/26 00:10  댓글주소  수정/삭제  댓글쓰기
    ㅡㅡ;;

  • 유닉스용 타임스탬프를 엑셀의 날짜로 변환...
    2006/09/26 15:37

    TRAC에서 report view를 통해 생성된 text 파일을 엑셀에서 읽고 보니...
    날짜가 이상하게 나온다.
    조사해 보니 TRAC에서 사용하는 DB(SQLite)가 날짜를 유닉스용 타임스탬프를 사용하기 때문...

    결과적으로...
    아래와 같이 변환하여 사용하면 된다.
    =유닉스타임스탬프/86400 + 365*70 + 17 + 9/24

    유닉스 타임스탬프는 1970년 1월 1일부터의 초이고 엑셀 시간은 1900년 1월 1일부터의 일을 의미.
    17은 70년동안 윤년이 17번 있었다는 의미이고 마지막 9/24는 대한민국이 UTC+9 시간대에 있기 때문...

    예제)
    1155946467 / 86400 + 365*70 + 17 + 9/24 = 25567.375
    25567.375의 셀서식을 날짜로 변경하면 2006-08-17 과 같은 날짜를 얻을수 있다.

    2006/09/26 15:37 2006/09/26 15:37
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

    1. Subject: 유닉스(Unix time)을 엑셀에서 바꿔보자!

      Tracked from The Cathedral and the Bazaar 2006/11/03 20:30  삭제

      PHP로 만들어진 게시판에서 노가다로 내용을 다른 곳으로 옮기려고 하는데, 갑자기 시간이 1155946467 이라고 적혀있더군요. 헉 난갑했습니다. 그러나 우리에게는 구글이 있었습니다. 찾아보니 ..


    x64 primer
    2006/09/22 09:15

    64bit는 64bit에만 설치가 가능하고(32bit 응용프로그램의 사용은 가능하다) Intel의 Itanium™과 32bit 및 64bit 시스템에 설치가 가능한 (당연히 32bit, 64bit 프로그램 실행이 가능하다) x64라고 알려진 Intel의 EM64T, AMD의 AMD64 이 있다.

    PE헤더 구조의 변화
    Win64의 포맷은 PE32+로 불린다. 두드러진 가장 큰 변화는  기존 예외처리 방식이 예외처리 정보를 스택에 추가되었다면 Win64는 테이블 기반의 예외 처리(exception handling)이다. 단점은 함수테이블 찾는것이 링크드 리스트보다 시간이 걸리는 것이고 장점은 매번 스택에 예외처리 블럭을 생성하는 오버헤드가 없다는 점이다.

    데이터 실행 보호(Data Execution Protection - DEP) 기능 추가
    고의적인든 아니든
    버퍼 오버런(buffer overrun)이 원래는 데이터 저장을 목적으로 했던 메모리 블락을 CPU에서 명령어로 인식하고 실행해 버리는 결과가 발생하곤 했었습니다. 이 DEP의 도움으로, 운영체제는, 의도한 코드 영역의 경계를 명료하게 설정할 수 있고, 이 의도된 경계를 벗어나는 코드 실행에 대해서는 CPU가 일종의 덫을 놓을 수 있게 되었습니다. 이 기능은 윈도우를 악의적인 공격에 덜 취약하게 만드는데 큰 도움을 줄 수 있다.
    윈도우 XP sp2 부터 기능이 추가되었고 시스템등록정보->고급->성능에서 볼수 있다. 보다 자세한 내용은 아래 링크 참조.
    http://www.microsoft.com/technet/prodtechnol/winxppro/ko/maintain/sp2mempr.mspx

    PatchGuard기술 추가
    syscall 테이블이나 인터럽트 디스패치 테이블(interrupt dispatch table-IDT)를 변경하는 사용자 프로그램이나 드라이버들은 보안상의 문제와 잠재적인 안정성의 문제를 일으켜 왔는데 x64의 내부에서는, 그러한 방식으로 커널의 메모리를 지원되지 않는 방식으로 바꾸는 방식이 허용되지 않습니다. 이러한 것을 강화시키는 기술이 PatchGuard 입니다. 이 기술은 중요한 커널 메모리의 위치가 바뀌는 것은 커널 모드의 쓰레드에서 항상 감시합니다. 그리고 메모리가 바뀌면, 시스템은 버그체크를 통하여 멈춰 버립니다.

    함수 호출 방식(Calling Convention)의 변경
    Win64의 경우는 하나의 함수 호출 방식이 존재합니다. fastcall 과 유사한 방식인데 처음의 4개의 인자는 특별히 디자인된 레지스터(RCX: 1 번째 정수 인자 RDX: 2 번째 정수 인자 R8: 3번째 정수 인자 R9: 4번째 정수 인자)에 전달되고 나머지는 스택으로 전달됩니다.  게다가 x64 코드 생성기는 (파라미터의 입장에서 보면) 얼마든지 큰 대상 함수에서도 쓸 수 있을 만큼 충분한 스택을 예약해 웬만한 경우가 아니면 RSP를 조작하는 경우가 없을겁니다.
    리턴값은 Win32에서와 마찬가지로 RAX에 저장됩니다.

    그외에 사항으로는

    링커의 기본주소 변경 4G 이상으로 설정
    64비트 포인터는 8바이트 이지만 int,long, DWORD는 4바이트
    레지스트터 이름 변경 RAX, RBX등으로, 기존 EAX, AX등 사용가능



    Visual Studio® 2005 에서 x64 어플리케이션의 개발
    추가중...


    참조
    Matt Pietrek의 x64 primer 원본(
    Matt Pietrek의 x64 primer 번역본)
    64비트 윈도우 개괄

    2006/09/22 09:15 2006/09/22 09:15
    TAG , ,
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다