C/C++의 일반 포인터는 메모리 관리 측면에서 여러가지 문제점이 있습니다. 메모리 누수, 허상 포인터 (Dangling pointer), 할당 실패와 같은 문제는 개발자들의 영혼과 근무시간을 갉아먹는 존재들입니다!
그래서 등장한 스마트 포인터 (Smart Pointer)는 개발자가 메모리 문제 때문에 힘들어하지 않도록, 똑똑하게 메모리를 관리하는 객체입니다. 스마트 포인터는 내부에 참조 카운트 (Reference Count)를 갖고 있고 참조할 때마다 숫자가 늘어납니다. 반대로 참조 카운트가 0이 되면 자동으로 메모리를 해제하는 똑똑한 포인터입니다.
이것이 OpenCV에도 있는데, 사용법은 간단합니다.
먼저, Wrapping 하려는 클래스 객체에 대한 포인터 템플릿의 인스턴스를 정의합니다. 여기서는 Matx33f 클래스 객체를 wrapping 하여 포인터를 새로 만들었습니다.
cv::Ptr<Matx33f> ptr1(new cv::Matx33f); // 방법 1
cv::Ptr<Matx33f> ptr2 = makePtr<Matx33f>(); // 방법 2
cout << (*ptr1) << endl;
(*ptr1).val[0] = 3;
ptr1->val[8] = 6;
ptr2 = ptr1;
cout << (*ptr2) << endl;
스마트 포인터는 일반 포인터와 동일한 방법으로 사용할 수 있습니다
위 예제에서도 *나 -> 를 사용해서 Matx33f의 값을 셋팅하고 화면에 출력했습니다.