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