2011-03-05 22 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()」的定義是什麼? – 2011-03-05 00:56:08

+0

這與您的'shared_ptr'問題無關,但我想指出,爲每個幀分配640x480圖像對我來說似乎效率很低。您可能要考慮重新使用已分配的圖像。檢查一種稱爲「雙緩衝」的技術(http://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics)。 – 2011-03-06 15:46:47

+0

@Maxim。 IplImage是OpenCV中使用的一種結構。它保存圖像的數據和元數據。 cvCreateImage也是OpenCV的形式,併爲此分配必要的內存。 @Emile:當然你是對的。應該更好地重複使用相同的圖像,只是將所有內容塗成黑色。甚至不需要使用雙緩衝。感謝您的高舉。 – Theo 2011-03-09 15:54:30

回答

3

我假設你在調試版本出現這個錯誤?

哪種分配內存的方法使用cvCreateImage()newmalloc()boost::shared_ptr使用delete銷燬內存,因此您的系統可能會檢測到數據未按「正確方式」分配,即使用新的方式。

如果是這種情況,那麼你必須使用shared_ptr與自定義刪除(查看更多信息的助推文檔),所以內存得到正確釋放。

+0

+1即使'cvCreateImage()'沒有使用'new'分配,你可以爲'shared_ptr'指定一個自定義釋放器作爲[構造函數]中的第二個參數(http://www.boost.org/doc) /libs/1_46_0/libs/smart_ptr/shared_ptr.htm#allocator_constructor)。 – 2011-03-05 15:57:46

+0

@Sam,這就是我所說的定製刪除器 - 我認爲這就是它在Boost文檔中所稱的... – 2011-03-05 16:14:18

+0

是的,我只是想添加一條註釋,表示我的upvote而不是編輯你的答案。 – 2011-03-05 16:22:11