内存损坏问题

时间:2018-02-28 14:16:27

标签: c++ memory

在我的应用程序中,我正在创建一个链接的文件列表。我在每个节点的缓冲区中为这些文件的内容分配空间,然后从文件缓冲区中的key = value对中提取Value信息并放入一个数组:

代码逻辑如下:

对文件夹

中的所有文件重复以下操作
{
    fileLinkedList->pFileContentBuffer= new unsigned char[sizeofthefileinbytes]
...
}

所以我现在分配了缓冲区。

下一步: 对于某些文件(在单独行上具有键=值对的文件)重复此

char* tempBuffer = fileLinkedList->pFileContentBuffer;
...
pEndOfBuffer = tempBuffer + filesize - 2;//just before last CR and LF
char* eachLine = tempBuffer;
eachline = strtok(tempBuffer, "\n\r");//i see that this modifies tempBuffer but 
                                      //replaces 1 byte CR with 1 byte \0 so 
                                      //doesnt look like causing overflow
int i=0;
while(eachline < pEndOfBuffer) {
    stringId[i].text=malloc(sizeofValue + 1);
    int len=strncpy_trimspaces(stringId[i].text,eachline+someoffset,someoffset);

    stringIds[i].text[len] = 0;//null terminate
    i++;
    if ((eachline = strtok(NULL, "\n\r")) == NULL)
         eachline = tempBuffer + filesize;
}

现在我从缓冲区中提取了信息(值),所以我将其删除

delete[] tempBuffer;

这会传递少量文件,然后崩溃。所有文件的大小和格式都相似。它崩溃了:

free(): invalid next size (normal): 0x08895cd8 ***

请检查上面的代码逻辑,让我知道代码逻辑或用于检测内存损坏的任何方法或工具是否有问题。

如果我将buffersize(sizeofthefileinbytes)增加几个字节,它就不会崩溃。

1 个答案:

答案 0 :(得分:0)

好吧问题似乎是在循环中最后一次调用strkok,因为修复它没有崩溃。

所以我提供的代码中的相关代码:

...
pEndOfBuffer = tempBuffer + filesize - 2;//just before last CR and LF
....
eachline = strtok(tempBuffer, "\n\r");//i see that this modifies tempBuffer but 
                                      //replaces 1 byte CR with 1 byte \0 so 
                                      //doesnt look like causing overflow
.....
while(eachline < pEndOfBuffer) {
   .....
    if ((eachline = strtok(NULL, "\n\r")) == NULL)
         eachline = tempBuffer + filesize;
}

在循环中我添加了一个条件:

while(eachline < pEndOfBuffer) {
       .....
       if(pEndOfBuffer[0] != '\0'){
        if ((eachline = strtok(NULL, "\n\r")) == NULL)
             eachline = tempBuffer + filesize;
       }else{
         break;
       }
    }

循环中的strtok执行了一次,所以似乎破坏了内存。我说似乎是因为从逻辑上看,它不需要在最后一次迭代中执行最后一次pEndOfBuffer以\ 0开头,因为strtok null终止了令牌。我不认为我需要一个工具来指出损坏的内存,如果我修复代码逻辑并且它不会崩溃。

虽然在某处写了探索,因为strtok修改了原始字符串,你应该在副本上工作。他们用strdup制作副本。当我尝试它不起作用。我无法理解,如果我使用副本,原件会删除,但副本仍然必须删除,如果它破坏了原来的方式,它将如何帮助。无论如何都很好,除了我得到的2个负面点之外:( 感谢