Динамически размещать изображение в shared_ptr каждый кадр - PullRequest
0 голосов
/ 05 марта 2011

Я пытаюсь использовать 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 Ответ

3 голосов
/ 05 марта 2011

Я предполагаю, что вы видите эту ошибку в отладочной сборке?

Какой метод выделения памяти использует cvCreateImage()? new или malloc()? boost::shared_ptr использует delete для уничтожения памяти, поэтому может быть вероятность того, что ваша система обнаружит, что данные не были распределены «правильным способом», то есть с помощью new.

Если это так, то вам придется использовать shared_ptr с пользовательским средством удаления (для получения дополнительной информации обратитесь к документам надбавки), чтобы память освободилась правильно.

...