Нужно ли cvReleaseImage, если изображение возвращается? - PullRequest
0 голосов
/ 14 апреля 2011

Я работаю с OpenCV 2.2 и мне интересно, нужно ли мне освобождать память, выделенную для изображения, если изображение возвращается.У меня есть method1 (см. Ниже), который вызывается из основной программы несколько раз.Он возвращает IplImage, который был создан внутри метода.Где я должен выпустить изображение, созданное в методе?Если я отпущу его до команды возврата, я думаю, что ничего не будет возвращено?После команды возврата она не будет обработана.Итак, как мне избавиться от всех изображений dst, созданных во время выполнения моей программы ???

IplImage* Method1(IplImage* src) {
 IplImage *dst = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 1);
 [...]
 return dst;
}

Thx!

РЕДАКТИРОВАТЬ: Поэтому я должен назвать этот метод следующим образом:

IplImage* tmp;
tmp = cvCreateImage(cvSize(dst->width, dst->height), IPL_DEPTH_8U, 1);
tmp = Method1(src);

или

IplImage* tmp;
tmp = Method1(src);

, чтобы впоследствии правильно освободить память в основной программе?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011
  1. Если вы используете C ++, не используйте IplImage*, используйте cv::Mat, который автоматически выполняет управление памятью.
  2. Ваш первый метод создает утечку памяти (это не зависит от opencv - вы выделяете память для чего-то, затем перезаписываете указатель, так что теперь он недоступен (это означает, что у вас есть выделение, которое ничего не делает, и вы никогда не сможете чтобы освободить это.
2 голосов
/ 14 апреля 2011

Нет, иначе вы бы вернули указатель на некоторую освобожденную память.Просто убедитесь, что имя Method1 указывает, что вы возвращаете новое изображение, которое должно быть выпущено позже.

Вам придется выпустить его где-то снаружи (как только вы закончите с ним).

1 голос
/ 15 апреля 2011

Вы можете выделить память внутри функции. После того, как вы вернули изображение в вызывающей функции после использования dst, вы можете вызвать cvReleaseImage (& dst), чтобы очистить память

0 голосов
/ 13 июня 2013

Утечки памяти устраняются путем создания dst изображения вне функции, подобной этой:

void Method1(IplImage* src, IplImage* &dst) {
 [...]
}

IplImage* image0 = ...;
IplImage* image1 = cvCreateImage(cvSize(image0->width, image0->height), IPL_DEPTH_8U, 1);
Method1(image0, image1);   

И не забудьте использовать cvReleaseImage(&...) на обоихизображения потом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...