2010-05-24 2 views
1

O'1 tesselaton을 사용하는 자습서를 따랐습니다. 콜백 중 하나에서 malloc이 있으며 새 프레임을 렌더링 할 때마다 누수가 생성됩니다.메모리 누수 도움말 (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; 


} 

자유형 (정점)을 시도했지만 다각형이 렌더링되지 않았습니다. 또한 힙에 할당을 시도한 다음 삭제 (버텍스)를 수행했지만 다각형은 어색하게 렌더링되었습니다. 나는 무엇을해야할지 모르겠습니다.

감사

답변

1

dataOut이 무엇이든간에 free으로 전화해야합니다. 당신이 호출하는 함수에서 이런 짓을 예를 들어, : 나중에 그것을 사용 완료 후

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

는 당신은 free (dataOut)를 호출해야합니다. free (vertex) 인 경우 vertex의 주소를 *dataOut에 할당했기 때문에 dataOut이 가리키는 주소는 실제로 덮어 쓸 수 있습니다. 즉, 무료로 사용하지 마십시오. vertex; 무료 dataOut이 무엇이든 무료입니다.

+1

콜백이 반환 된 후 어딘가에 해제해야 할 수도 있습니다. – WhirlWind

+1

'자유롭게 dataOut이 가리키는 곳이면 자유롭게 사용할 수 있습니다. –

0

당신이 http://valgrind.org/에서 Valgrind의라고보고 싶을 도구. 그것은 당신이 리눅스 시스템에서 운영되고 있다고 가정합니다.

valgrind의 "-grind"는 독자의주의로 영어 단어 "grind"와 관련이 없습니다.

"Val"은 세계 "value"와 같습니다. "grind"는 짧은 'i'로 발음됩니다. 즉. "미소 지은"(오히려 "찾아낸"과 운율)보다는 "웃어 넘기"("주석이 달린"운율).

0

메모리를 dataOut 객체에 할당하기 때문에 정점을 해제 할 수 없습니다. DataOut 객체를 완료 한 후에는이를 해제해야합니다.

0

메모리 누수 상황을 해결하는 방법을 모르겠지만 "삭제"(나는 당신이 C++ '삭제'연산자를 사용한다고 가정)를 사용하여 메모리를 정리합니다. "malloc"으로 할당 된, 매우 낙심됩니다.

일반적으로 말하자면, 처음에 할당했던 기능에 충실해야합니다. C++에서는 'new'로 메모리를 할당 한 후에 'delete'를 사용하고, C에서는 'malloc'으로 메모리를 할당 한 후 'free'를 사용합니다. GLUT_TESS_COMBINE에 대한 the docs에 따르면

0

,

사용자는 gluTessEndPolygon가 호출 된 후 메모리 몇 시간을 확보 할 책임이있다.

한 가지 방법은 링크 된 목록에 할당 한 메모리를 추가하고 완료하면 모두 해제하는 것입니다.

0

사용을 마친 후에는이 기능 밖에서 데이터를 해제해야합니다. 다른 코드를 보지 않고도 그 코드가 어디 있는지 추측하기는 어렵습니다. 다른 곳에서 데이터를 할당하는 것이 더 좋을 수도 있고 포인터를 전달하여 다른 데이터를 수정할 수도 있습니다. 특히 많은 양의 데이터를 생성 할 가능성이 큰 경우 (이는 많은 양의 데이터 할당 및 해제를 피할 수 있습니다) 특히 그렇습니다.