2012-11-05 28 views
1

我還有另一個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

回答

7
char *pPngStr = new char[4096]; 
pPngStr = strtok(aData, "\n"); 

只是在新線之後,你忘記了,你去的指針和使用變量來存儲的其他數據。毫無疑問,存在內存泄漏。

+3

同樣重要的是要注意'delete [] x,y'不會調用delete [] y'。逗號操作符不以那種方式工作。 –

+0

好吧,我修復了這條線,Valgrind不再報告內存泄漏。它仍然告訴我'刪除pPngStr'雖然是無效的。它也說'delete [] pPngStr'無效。我不應該清理那個嗎? – user1787379

+0

當你的意思是「我固定那條線」時,你是否發現許多其他線條完全相同。事實上,你應該做的是刪除內存分配,因爲你只是沒有在任何地方使用它。 – SJuan76

4

你有所述線(GCC 4.6):

delete[] pPngStr, aData; 

確實不要做你認爲它的事情。

試試這個:

delete[] pPngStr; 
delete[] aData; 

注意:直到你解決這個問題SJuan76標識錯誤,我的答案是沒有實際意義。

+0

+1給你以及SJuan,這兩個修復都需要執行。 –