Выпустить Mat внутри std :: vector - PullRequest
3 голосов
/ 23 мая 2011

Используя OpenCV 2.2 , я пытаюсь освободить память, вызывая release для изображения Mat внутри std :: vector, например:

std::vector < Mat > matVec;

Однако, похоже,

for (int k = 0; k < matVec.size(); k++)
{

   matVec[k].release();

}

не освобождает какую-либо память (она все еще компилируется).

Я знаю, что в OpenCV 2.2 есть новое управление памятью, но я не смогвыявить проблему.

Аналогичный пример с типом IplImage* вместо Mat (с использованием cvReleaseImage() вместо функции-члена Mat .release()) работает просто отлично.

Есть какие-нибудь подсказки?

Ответы [ 2 ]

7 голосов
/ 23 мая 2011

.release() следует вызывать только в исключительных случаях, это не для повседневного использования.Просто очистите вектор:

std::vector<cv::Mat>().swap(matVec);

Это вызывает деструктор каждого из Mat s, освобождая память (если на нее не указывает cv::Mat - помните, cv::Mat, в отличие от * 1008)*, тип данных с подсчетом ссылок. Если на него ссылаются где-то еще, вы также должны очистить эту ссылку).Если вы хотите сохранить вектор, но избавиться от содержимого, замените строку .release() в своем коде на:

matVec[k] = cv::Mat();
1 голос
/ 23 мая 2011

Лучший способ - активировать деструктор каждого matVec[k] объекта. Вы можете сделать это, позволив matVec выпасть из области видимости или определив matVec как vector из Mat* и вручную выделять и освобождать каждый объект.

Это всегда безопаснее, поскольку OpenCV использует механизм подсчета ссылок для Mat объектов, и поэтому вы не хотите освобождать данные в Mat напрямую.

...