簡體   English   中英

Valgrind在定義char *數組時報告內存泄漏

[英]Valgrind reports a memory leak when defining a char* array

我還有另一個無法識別的valgrind錯誤。 我有一些代碼加載腳本,然后使用strtok()標記已加載到緩沖區的腳本中的數據。 我使用以下方法在堆上為緩沖區分配內存:

char *pPngStr = new char[4096];

然后在函數結尾,我使用以下命令釋放內存:

delete[] pPngStr;

Valgrind如此報告分配:

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代碼,並且還會從此處未定義的數據結構中調用成員。 使用Qt Creator 2.4.1在帶有g ++(gcc 4.6)的Xubuntu 12.04中編譯代碼時也不會出現任何警告或錯誤。

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

在新代碼之后的一行中,您忘記了要使用的指針,而是使用該變量存儲其他數據。 毫無疑問,內存泄漏。

您擁有的行:

 delete[] pPngStr, aData; 

不按照您的想法去做。

嘗試以下方法:

delete[] pPngStr;
delete[] aData;

注意 :在修復SJuan76識別的錯誤之前,我的回答還沒有定論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM