2011-03-05 3 views
0

여기서는 처음으로 shared_ptr을 사용하려고하는데 여기에 문제가 있습니다.각 프레임의 shared_ptr에 이미지를 동적으로 할당하십시오.

모든 프레임마다 IplImage를 받고 shared_ptr 클래스 멤버에 할당하여 마지막 이미지를 릴리스하려고합니다. 이것은 다음과 같습니다.

class Detector { 
public: 
     void Detector::updateImage { 
      main_image_.reset(cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3)); 
     } 
private: 
     boost::shared_ptr<IplImage> main_image_; 
} 

나는 루프에서 updateImage를 호출합니다. cvCreateImage는 해당 이미지 크기에 대해 일부 메모리를 동적으로 할당합니다.

처음으로 루프가 실행되면 모든 것이 정상적으로 작동합니다. 이제 두 번째 _BLOCK_TYPE_IS_VALID 어설 션 오류가 발생합니다. 이것은 shared_ptr이 포인터를 삭제하려 할 때 발생합니다. 내가 뭔가 잘못하고 있던 가정

그래서, 내가 같은 많은 다른 옵션을 시도 :

if (!main_image_) 
    main_image_ = boost::shared_ptr<IplImage> (cvCreateImage... 
else 
    main_image_.reset(cvCreateImage...) 

도 작동하지 않았다. 처음에 shared_ptr을 재설정하려고 시도했으나 작동하지 않았습니다. 새 임시 shared_ptr을 설정하고 내 main_image_ptr에 할당하려고했습니다. 성공하지 못했습니다.

여기서 제가 잘못 되었나요? 일반 포인터를 사용하고 수동으로 이미지를 공개하는 것은 매력처럼 일했습니다. 사전에

감사합니다,

+1

'IplImage'와'cvCreateImage()'의 정의는 무엇입니까? –

+0

이것은'shared_ptr' 문제와 관련이 없지만 각 프레임에 대해 640x480 이미지를 할당하는 것이 나에게 비효율적 인 것처럼 보입니다. 이미 할당 된 이미지를 재사용하는 것이 좋습니다. "이중 버퍼링"(http://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics)이라는 기술을 확인하십시오. –

+0

@Maxim. IplImage는 OpenCV에서 사용되는 구조입니다. 이미지에 대한 데이터 및 메타 데이터를 보유합니다. cvCreateImage는 또한 OpenCV 형식이며 필요한 메모리를 할당합니다. @Emile : 물론 당신 말이 맞습니다. 동일한 이미지를 재사용하면 모든 것을 검정으로 칠하는 것이 좋습니다. 더블 버퍼링을 사용하지 않아도됩니다. 머리를 가져 주셔서 감사합니다. – Theo

답변

3

테오 난 당신이 디버그 빌드에서이 오류를보고있는 가정?

cvCreateImage()은 어떤 메모리 할당 방법을 사용합니까? new 또는 malloc()? boost::shared_ptrdelete을 사용하여 메모리를 파괴하므로 데이터가 "올바른 방법"으로 할당되지 않았 음을 시스템이 감지 할 수 있습니다 (예 : new 사용).

그렇다면 shared_ptr을 사용자 정의 삭제 자 (자세한 정보는 부스트 문서를 참조하십시오)와 사용해야하므로 메모리가 올바르게 릴리스됩니다.

+0

+1'cvCreateImage()'가'new'를 사용하여 할당하지 않아도, [생성자] (http://www.boost.org/doc)의 두번째 인수로'shared_ptr'에 커스텀 deallocator를 할당 할 수 있습니다 /libs/1_46_0/libs/smart_ptr/shared_ptr.htm#allocator_constructor). –

+0

@Sam, 그게 제가 커스텀 Deleter로 언급 한 것입니다. 부스트 문서에서 부르는 것 같아요. –

+0

예, 답을 편집하는 대신에 내 upvote를 나타내는 주석을 추가하고 싶었습니다. –

관련 문제