티스토리 뷰
cv 1.0은 release 함수를 명시적으로 호출하여 메모리를 해제 시켜 주어야 한다.
예상과 달리 히한하게(?) 구현되어 있는 matrix 관리 부분 (그 때문인지 2.0 에서는 새로 작성되었다)을 건드리지 않기위해 scoped_ptr을 이용해볼까 했는데 이분은 사용자가 지정한 release 함수는 받지 않는다.
scoped_ptr을 제외하면 다들 덩치가 산만하니 포기하고, scoped_ptr를 release 부분만 release 함수를 호출하도록 새로 작성하였다.
이러고 나니까 왠지 억울해서 operator new와 operator delete를 작성해놓은 class 타입를 간단히 scoped_ptr 속에 집어넣으면 어떨까? 하여 해봤는데. 작동은 한다.
하지만 테스트 코드를 보면 알겠지만 실제 사용하기 너무 불편하다.
//-------------------------------------------------------------------------- // PURPOSE: Just try to wrap operator delete and operator new //-------------------------------------------------------------------------- class CvMatWrap { public: explicit CvMatWrap( CvMat* p = 0 ) : ptr( p ) { throw std::bad_alloc( "Throw by operator new on CvMatWrap" ); } operator CvMat*() const { return ptr; } // Just call std::new // Not implemented yet on VC++ : warning C4290: C++ exception specification // ignored except to indicate a function is not __declspec(nothrow) // static void* operator new( std::size_t size ) throw( std::bad_alloc ) { static void* operator new( std::size_t size ) { return ::operator new( size ); } static void operator delete( void* pMemory, std::size_t ) throw() { // Implicit covertion to CvMat* CvMat* _mem = * reinterpret_cast( pMemory ); ::cvReleaseMat( &_mem ); } // Intentionally hide std delete private: CvMat* ptr; }; typedef boost::scoped_ptr< CvMatWrap > CvMatPtr2;
TEST( CvPtrTest, HelloWorld ) { CvMatPtr2 helloWorld( new CvMatWrap( ::cvCreateMat( 100, 10, CV_32F ) ) ); }
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크