Valgrind在定义char*数组时报告内存泄漏

use*_*379 1 c++ memory arrays valgrind memory-leaks

我有另一个valgrind错误,我似乎无法弄清楚.我有一些代码加载脚本然后使用strtok()来标记已加载到缓冲区的所述脚本中的数据.我使用以下内容在堆上为我的缓冲区分配内存:

char *pPngStr = new char[4096];
Run Code Online (Sandbox Code Playgroud)

然后在函数结束时,我使用以下内容释放内存:

delete[] pPngStr;
Run Code Online (Sandbox Code Playgroud)

Valgrind报告分配如下:

173 bytes in 1 blocks are definitely lost in loss record 3,753 of 4,627
Run Code Online (Sandbox Code Playgroud)

Valgrind还报告我释放内存的行:

Invalid free() / delete / delete[] / realloc()
Run Code Online (Sandbox Code Playgroud)

这一切都在同一个函数中,变量只对那个函数本地而不是类.我对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;
Run Code Online (Sandbox Code Playgroud)

}

*请注意:此函数包含OpenGL代码,并且还从未在此处定义的数据结构调用成员.使用Qt Creator 2.4.1,代码也可以使用g ++(gcc 4.6)在Xubuntu 12.04中编译而没有任何警告或错误

SJu*_*n76 7

char *pPngStr = new char[4096];
pPngStr = strtok(aData, "\n");
Run Code Online (Sandbox Code Playgroud)

就在新的后面的行中,你忘记了你去的指针并使用变量来存储其他数据.毫无疑问,存在内存泄漏.

  • 同样重要的是要注意`delete [] x,y`不会调用`delete [] y`.逗号运算符不会那样工作. (3认同)