Утечка памяти в C - потеря динамического массива данных - PullRequest
1 голос
/ 21 октября 2011

У меня есть function1, где я каждый раз выделяю массив с определенным количеством байтов.

Когда я использую printf, я вижу, что мои данные загружаются в этот массив.

function1 (other arguments, CvPoint2D32f* array1)

Тогда есть function2, в котором я вызываю function1 и присваиваю данные array1 другой переменной (array2).

function2(other stuff, CvPoint2D32f* array2)

Когда я использую printf, я вижучто я не могу получить доступ к своим данным.Программа печатает 0.000 ..

function2, вызываемая моей основной программой, в которой я назначаю данные третьей переменной ...

Я ищу и ищу, но не могу найти то, чтонеправильно.

Недостаточно передать указатель?

Помогите, если я не был достаточно конкретен, спросите меня:

function1(IplImage* grey, IplImage* image, CvPoint2D32f *array1){

    int array_counter = cvFindContours(grey, storage_color, &colorcontoursizeof(CvContour),
                                 CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
    array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f))
    if (array_counter == 0){
        printf("Error allocating memory or Just a colour missing!!!\n\n\n");
        free(Man);
    }

    cvReleaseMemStorage(&storage_color); // Releasing memory.
    free(Man);

    return array_counter;
}    


int function2(IplImage* image, CvPoint2D32f *array2, other stuff){

    ...other stuff...      

     // Find the contours for the different colors.
    r_counter = function1(image1, image2, array2);

    return 0;
}

РЕДАКТИРОВАТЬ =======================================

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

Я получаю сообщение об ошибке при компиляции в строке, где я загружаю данные в массив1 о неклассовом типе CvPoint2D32f.

Это то, что я делаю в этих строках, гдеЯ получаю сообщение об ошибке:

array1[cnt].x = (tpt1.x + tpt2.x)/2; 
array1[cnt].y = (tpt1.y + tpt2.y)/2;

2-е РЕДАКТИРОВАНИЕ =========================

оба ответа помоглии были правы.Спасибо всем!Проблема решена.Я использовал двойные указатели на обе функции, чтобы экспортировать данные из function1 в function2 и из function2 в основную программу.Я использовал некоторые временные переменные, которые очень помогли.Это было менее запутанным.

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

(Пытаясь объяснить семантику передачи указателя C, потерпите меня немного).

C имеет только передачу по значению, что означает, что вы не можете изменить аргумент функции. Итак, в:

function1(IplImage* grey, IplImage* image, CvPoint2D32f *array1){
    ....
    array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f))
    ....
}
r_counter = function1(image1, image2, array2);

Изменение, внесенное вами в array1 в function1, не отображается за пределами этой функции (array1 передается по значению, а не по ссылке).

Чтобы обойти это, передайте в функцию переменную, которая содержит указатель на переменную, которую вы хотите передать по ссылке:

function1(IplImage* grey, IplImage* image, CvPoint2D32f **array1){
    ....
    *array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f))
    ....
}
r_counter = function1(image1, image2, &array2);

т.е. просто добавьте еще один уровень косвенности. См. RFC 1925, истина 6а ( Всегда можно добавить еще один уровень косвенности. ).

2 голосов
/ 21 октября 2011

Два сценария:

  // SCENARIO 1: Array allocated outside a function and passed into it
  myfunc (char * buff)
  {
     buff[0] = 'A';
     ...

  main ()
    ...
    char *mybuffer = NULL;
    if ((mybuffer = malloc (100))
      myfunc (mybuffer);
      ...

.

  // SCENARIO 2: Array allocated inside of a function and passed out from it
  myfunc (char **buff)
  {
     *buff = malloc (100);
     ...

  main ()
    char *mybuffer = NULL;
    myfunc (&mybuffer);
    ...

Я думаю, проблема в том, что вам, вероятно, нужен сценарий 2. Попробуйте синтаксис "указатель-указатель" в вашем "function1 () "

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