Помогите с утечкой памяти (malloc) - PullRequest
1 голос
/ 25 мая 2010

Я следовал руководству по использованию тесселатона OGL. В одном из обратных вызовов есть malloc, и он создает утечку каждый раз, когда я отрисовываю новый кадр.

void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4],
                              GLfloat weight[4], GLdouble **dataOut)
{
    GLdouble *vertex;

    vertex = (GLdouble *) malloc(6 * sizeof(GLdouble));
    vertex[0] = coords[0];
    vertex[1] = coords[1];
    vertex[2] = coords[2];


    for (int i = 3; i < 6; i++)
    {

        vertex[i] = weight[0] * vertex_data[0][i] +
            weight[1] * vertex_data[0][i] +
            weight[2] * vertex_data[0][i] +
            weight[3] * vertex_data[0][i];
    }


    *dataOut = vertex;


}

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

Спасибо

Ответы [ 6 ]

1 голос
/ 25 мая 2010

Вам следует позвонить free на все, на что указывает dataOut. Например, если вы сделали это из вызывающей функции:

combineCallback (coords, vertex_data, weight, &dataOut);

тогда вам следует позвонить free (dataOut) после того, как вы закончите использовать его позже. Если вы free (vertex), это фактически означает, что все, на что указывает dataOut, может быть перезаписано, поскольку вы присвоили адрес vertex *dataOut. Другими словами, не освобождайте vertex; бесплатно все, на что dataOut указывает.

0 голосов
/ 25 мая 2010

Вам нужно освободить данные где-то за пределами этой функции, после того, как вы закончили ее использовать. Не видя другого кода, довольно сложно догадаться, где это будет. Возможно, было бы лучше разместить данные в другом месте и передать указатель на них, чтобы это могло изменить эти другие данные. Это особенно верно, когда вы можете сгенерировать довольно много данных (это может избежать выделения и освобождения большого количества данных).

0 голосов
/ 25 мая 2010

Согласно документам для GLUT_TESS_COMBINE,

Пользователь отвечает за освобождение памяти через некоторое время после вызова gluTessEndPolygon.

Один из способов - добавить память, выделенную для связанного списка, и освободить ее, когда закончите.

0 голосов
/ 25 мая 2010

Я не уверен, как исправить ситуацию с утечкой памяти, однако, я хотел бы отметить одну вещь: использование «delete» (я полагаю, вы имели в виду оператор c ++ «delete») для очистки памяти, которая была выделена с "malloc", крайне не рекомендуется.

Вообще говоря, вам нужно придерживаться соответствующих функций для того, что вы использовали для распределения в первую очередь. В C ++ вы будете использовать «delete» после выделения памяти с помощью «new», а в C вы будете использовать «free» после выделения памяти с помощью «malloc».

0 голосов
/ 25 мая 2010

Вы не можете освободить вершину, потому что вы назначаете память для объекта dataOut. Вам нужно освободить объект dataOut, как только вы закончите с ним.

0 голосов
/ 25 мая 2010

Инструмент, который вы хотите посмотреть, называется valgrind, на http://valgrind.org/. Это предполагает, что вы работаете в системе Linux.

Как примечание для читателей, "-grind" в valgrind не имеет отношения к английскому слову "grind".

«Вал» как в мировом «значении». «Измельчение» произносится с коротким «я» - т.е. «ухмыльнулся» (рифмуется со словом «консервированный»), а не «ухмылялся» (рифмуется со словом «найти»).

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