티스토리 뷰

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
링크