我還有另一個valgrind錯誤,我似乎無法弄清楚。我有一些加載腳本的代碼,然後使用strtok()來標記已加載到緩衝區的腳本中的數據。Valgrind在定義char *數組時報告內存泄漏
delete[] pPngStr;
Valgrind的報告分配爲這樣:
char *pPngStr = new char[4096];
然後在函數結束時,我用釋放內存:
我用下面的堆中分配內存爲我的緩衝區173 bytes in 1 blocks are definitely lost in loss record 3,753 of 4,627
Valgrind的也報道,我釋放內存爲線:
Invalid free()/delete/delete[]/realloc()
這是所有在相同的功能是變量是局部只有該功能,而不是類。我對valgrind認爲這是一次內存泄漏感到迷茫。我正在分配所有我需要的內存,然後在完成時釋放它。我看不出有什麼問題。
下面是完整的函數(也可以是有點亂):
void CSprite::LoadSprite()
{
FILE *pF = fopen("Data/Art/coin/coin.sprite", "rb");
if(!pF)
{
return;
}
fseek(pF, 0, SEEK_END);
int length = ftell(pF);
fseek(pF, 0, SEEK_SET);
char *aData = new char[length];
fread(aData, 1, length, pF);
CheckGLError();
/**
* The scripts are setup like so:
***********************************************
* Pngs:
* 4; // This is the number of frames.
* <pngname>_001.png;
* <pngname>_002.png;
* <pngname>_003.png;
* <pngname>_004.png;
*
* Properties:
* name=<obj name>;
* width=###;
* height=###;
* framerate=0.### // rate in seconds
************************************************
*/
mpSprite = new SGfxSprite;
char *pPngStr = new char[4096];
pPngStr = strtok(aData, "\n");
pPngStr = strtok(NULL, "\n");
int iNumFrames = atoi(pPngStr);
mpSprite->numFrames = iNumFrames;
mpSprite->textures = new GLuint[iNumFrames];
glGenTextures(iNumFrames, mpSprite->textures);
int i = 0; // used for loop only!
while(pPngStr != NULL)
{
pPngStr = strtok(NULL, "\n");
if(!strcmp(pPngStr, "Properties:") || i >= iNumFrames)
{
break;
}
if(mpPng->LoadPng(pPngStr))
{
CheckGLError();
glBindTexture(GL_TEXTURE_2D, mpSprite->textures[i]);
CheckGLError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
CheckGLError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
CheckGLError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
CheckGLError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
CheckGLError();
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
CheckGLError();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mpPng->miWidth, mpPng->miHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, mpPng->mpData);
CheckGLError();
}
++i;
}
pPngStr = strtok(NULL, "=\n");
pPngStr = strtok(NULL, "\n");
mpSprite->name = pPngStr;
pPngStr = strtok(NULL, "=\n");
pPngStr = strtok(NULL, "\n");
mpSprite->width = atoi(pPngStr);
pPngStr = strtok(NULL, "=\n");
pPngStr = strtok(NULL, "\n");
mpSprite->height = atoi(pPngStr);
pPngStr = strtok(NULL, "=\n");
pPngStr = strtok(NULL, "\n");
mpSprite->framerate = (atof(pPngStr) * 1000);
mpSprite->x = 0;
mpSprite->y = 0;
mpSprite->currentFrame = 0;
mpSprite->paintTimer = 0;
fclose(pF);
delete[] pPngStr, aData;
}
*請注意:此函數包含的OpenGL代碼和也調用從數據結構成員都沒有定義的這裏。該代碼還編譯沒有在Xubuntu的12.04克與任何警告或錯誤++用Qt創建者2.4.1
同樣重要的是要注意'delete [] x,y'不會調用delete [] y'。逗號操作符不以那種方式工作。 –
好吧,我修復了這條線,Valgrind不再報告內存泄漏。它仍然告訴我'刪除pPngStr'雖然是無效的。它也說'delete [] pPngStr'無效。我不應該清理那個嗎? – user1787379
當你的意思是「我固定那條線」時,你是否發現許多其他線條完全相同。事實上,你應該做的是刪除內存分配,因爲你只是沒有在任何地方使用它。 – SJuan76