0

私のOpenGLプロジェクトにBillDudneyの.Objモデルローダーを実装しましたが、現在、大量のメモリリークが発生しています。

楽器を使って、以下の機能に絞り込むことができました。そして、それはptrが解放されないことと関係があると思いますが、それでも関数の最後でptrを返す必要があります。

const void * TextureCoordBytes(CFAllocatorRef allocator, const void *value, GLuint *size)
{
// extract the count
GLuint count = ((GLuint *)value)[0];
void *ptr = NULL;
if(1 == count)
{ // a 1D texture
    ptr = CFAllocatorAllocate(allocator, sizeof(GLfloat), 0);
    ((GLfloat*)ptr)[0] = ((TextureCoord1D *)value)->u;
    *size = sizeof(GLfloat);
}
else if(2 == count)
{ // a 2D texture
    ptr = CFAllocatorAllocate(allocator, 2 * sizeof(GLfloat), 0);
    ((GLfloat*)ptr)[0] = ((TextureCoord2D *)value)->u;
    ((GLfloat*)ptr)[1] = ((TextureCoord2D *)value)->v;
    *size = 2 * sizeof(GLfloat);
}
else if(3 == count)
{ // a 3D texture
    ptr = CFAllocatorAllocate(allocator, 3 * sizeof(GLfloat), 0);
    ((GLfloat*)ptr)[0] = ((TextureCoord3D *)value)->u;
    ((GLfloat*)ptr)[1] = ((TextureCoord3D *)value)->v;
    ((GLfloat*)ptr)[2] = ((TextureCoord3D *)value)->w;
    *size = 3 * sizeof(GLfloat);
}
return ptr;
}

私がここで欠けているもの、または私が使用できる方法を知っている人はいfree(ptr);ますreturn ptr;か?

4

1 に答える 1

0

解放するよりも、最初にptrを返し、割り当てられたデータを使用する必要があります。返されたptr-sのコンシューマーは、不要になったとき、またはアプリの終了時に解放を処理する必要があります。

于 2012-07-04T17:02:34.110 に答える