2012-01-25 2 views
4

Я уже какое-то сообщение о выпуске всего IplImage и всей структуры CvMat и CvMemStorage, но все же у меня проблемы с памятью.релиз памяти opencv

ли я выпустить также CvPoint, CvScalar, CvPoint* (массив из 3 CvPoints, мне придется освободить каждый элемент тоже?)

Если я должен освободить все эти вещи, как я? Я не нашел никакой функции для этого. Я использую OpenCV 2.1 в C/C++.

Вот как я их декларировать:

CvScalar b1; 
CvScalar f; 
float *data=(float*)resd->imageData; (need to release data) 
CvPoint *point; 
CvPoint pt; 
CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0])); 

ответ

5

Этот вопрос гораздо более связан с C, чем OpenCV. Например, такие:

CvScalar b1; 
CvScalar f; 
CvPoint pt; 

являются локальными переменными, и поэтому они автоматически dealocatted, когда объем { } они принадлежат завершении выполнения.

Это:

CvPoint *point; 

является указателем, и в то же время является локальной переменной. Вы не должны delete или free(), потому что вы не выделили для него никакой памяти через new или malloc(). Это вызовет проблемы (возможно, сбой).

Но data с другой стороны:

float *data = (float*)resd->imageData; 

является указателем и локальная переменная, которая содержит блок памяти. Тем не менее, это не разумно delete[] data; или free(data) в этом конкретном случае, потому что вы не выделили эту память напрямую. Очевидно, что эта память была выделена как часть resd, что означает, что вам нужно проверить код и узнать, как была объявлена ​​/ инициализирована переменная resd, а затем выполните соответствующую процедуру для ее выпуска. Поскольку я знаю бит litle об OpenCV, я могу сказать, что resd - это IplImage*. Если вы использовали cvCreateImage(), чтобы создать эту переменную, то это также ваша работа по ее выпуску с cvReleaseImage().

В прошлом:

CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0])); 

Это типичный случай динамического распределения памяти, где конкретно выделить объем памяти. Поскольку ptsCorner - это локальная переменная и указатель, когда область, к которой он принадлежит, заканчивает выполнение, вы потеряете ссылку на этот блок памяти, и она будет просто потеряна в вашей ОЗУ, освободит пространство памяти и вызовет утечку. Нет необходимости говорить, что вы должны выполнить free(), чтобы освободить память в этом случае.

1

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

Если нет, то когда функция выходит за пределы области видимости, переменные будут автоматически уничтожены.

Если вы разместите свой код, тогда его будет легче увидеть.

+0

Добавить объявление, весь код очень длинный, но я думаю, теперь яснее, btw Я не использую новый, поэтому я думаю, что мне нужно выпустить только плавающие * данные (я пытаюсь удалить, но я получаю время выполнения ошибка) и * ptsCorner – andrea

+0

Где вы используете malloc, вам нужно будет использовать free() для восстановления памяти. Будьте осторожны, если это массив, который вам нужно вызвать free() для каждого члена массива. Много учебников о том, как это сделать – TomP89

0

Я думаю, что лучший способ решить ваши проблемы - прочитать хороший учебник о указателях.

Вот один http://www.cplusplus.com/doc/tutorial/pointers/

Что вы говорите, есть OpenCV проблемы, на самом деле является отсутствие понимания языков программирования. Итак, начните с основ, реклама продолжайте!

Смежные вопросы