오늘의../오늘의 뻘짓

[C++] memcpy 후, 힙 손상 에러 발생

호마 2014. 11. 11. 14:02

[에러창]

Windows가 Viewer.exe에서 중단점을 트리거했습니다. 

힙이 손상되었거나 Viewer.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다. 

자세한 진단 정보는 [출력] 창을 참조하십시오. 


bitmap_image 객체 초기화 코드에서 힙 손상이 발생했다.


  1. // 배열을 이미지로 만든다.
  2. int CArray2Bmp::SetArrayBitmap(unsigned char *mg, unsigned char *ph, char* savepath, bool byteOrder, ComplexData data)
  3. {  
  4.     int ns = this->ns;
  5.     int nl = this->nl;
  6.  
  7.     bool ImageByteOrder = byteOrder;    // TODO : 바이트 순서 체크해야함..
  8.  
  9.     bitmap_image image_data(ns, nl);
  10. ...


(뜬금없이 왜..)




[출력]

Critical error detected c0000374

Windows가 Viewer.exe에서 중단점을 트리거했습니다.

힙이 손상되어 Viewer.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.

SBAViewer.exe에 포커스가 있을 때 사용자가 F12 키를 눌렀기 때문일 수도 있습니다.

자세한 진단 정보는 [출력] 창을 참조하십시오.



디버깅 결과 메모리 관리 함수를 사용한 뒤로부터 발생하는 것을 발견하였다.



  1. // 외부에서 색상값을 받아온다.
  2. void CArray2Bmp::SetColor(float r[360]float g[360]float b[360])
  3. {
  4.     // 받아온 색상값 복사
  5.     memcpy(m_red, r, sizeof(float) * 360);
  6.     memcpy(m_grn, g, sizeof(float) * 360);
  7.     memcpy(m_blue, b, sizeof(float) * 360);
  8. }



검색 결과 - 힙 손상의 여러 원인


1. 메모리 할당 영역 밖에 쓰기를 시도 했다

2. 메모리 초기화나 삭제를 두번 이상 했다.

3. 클래스의 모든 변수를 초기화 시켜주지 않았다.


등등 여러가지이지만


이번 힙 손상의 원인은 메모리를 할당해준 변수의 초기화를 잘못해줘서였다.


[수정전]

  1. CArray2Bmp::CArray2Bmp()
  2. {
  3. // 배열 초기화
  4. for(int i=0; i<360; ++i)
  5. {
  6. m_red[i] = NULL;
  7. m_grn[i] = NULL;
  8. m_blue[i] = NULL;
  9. }
  10. }

[수정후]

  1. CArray2Bmp::CArray2Bmp()
  2. {
  3.     // 배열 초기화
  4.     memset(m_red, NULLsizeof(float) * 360) ;
  5.     memset(m_grn, NULLsizeof(float) * 360) ;
  6.     memset(m_blue, NULLsizeof(float) * 360) ;
  7. }


이렇게 수정하니 에러가 없어졌당..


하지만, 왜 하필이면 힙 손상이 저 코드에서 일어났는지는 아직도 모른다...