상세 컨텐츠

본문 제목

memcpy에서 <Ptr>이 잘못되었습니다. 에러

개발과 트러블슈팅

by 양고 2010. 11. 26. 15:13

본문

CvMat image_points;
...
image_points = cvCreateMat(1, IMAGES*ROWS*COLS*2, CV_32FC2);
...
memcpy(image_points->data.fl + image*ROWS*COLS*2*2, img_points->data.fl, sizeof(CvPoint2D32f)*ROWS*COLS*2);  // 사이즈 오류!

 위의 memcpy를 수행한 후 (CvMat*) image_points->data.fl 에 대해 <Ptr>이 잘못되었다고 한다. 실제로 해당위치에 memcpy를 하면 예외가 발생한다.
결론부터 말하자면 위 코드의 memcpy 시에 CvMat에서 할당한 메모리보다 더 큰 양을 카피함으로써 발생한 오류이다.
그런데 image_points->data.fl에 memcpy를 좀 잘못했다고 해서 본 CvMat 객체를 가리키는 image_points가 corrupt되다니?
원인은 다음과 같이 데이터-헤더 순의 allocation 때문이었다! 즉 데이터 자리가 범람해서 본 객체를 말아먹는; 

<그림> 원래 data.fl = 00b92b00

<그림> data.fl overwritten

관련글 더보기