内存损坏问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存损坏问题相关的知识,希望对你有一定的参考价值。
在我的应用程序中,我正在创建一个链接的文件列表。我在每个节点的缓冲区中为这些文件的内容分配空间,然后从文件缓冲区中的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, "
");//i see that this modifies tempBuffer but
//replaces 1 byte CR with 1 byte 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, "
")) == NULL)
eachline = tempBuffer + filesize;
}
现在我从缓冲区中提取了信息(值),所以我将其删除
delete[] tempBuffer;
这会传递几个文件,然后崩溃。所有文件的大小和格式都相似。它崩溃了:
free(): invalid next size (normal): 0x08895cd8 ***
请检查上面的代码逻辑,让我知道代码逻辑或用于检测内存损坏的任何方法或工具是否有问题。
如果我将buffersize(sizeofthefileinbytes
)增加几个字节,它就不会崩溃。
好吧问题似乎是在循环中最后一次调用strkok,因为修复它没有崩溃。
所以我提供的代码中的相关代码:
...
pEndOfBuffer = tempBuffer + filesize - 2;//just before last CR and LF
....
eachline = strtok(tempBuffer, "
");//i see that this modifies tempBuffer but
//replaces 1 byte CR with 1 byte so
//doesnt look like causing overflow
.....
while(eachline < pEndOfBuffer) {
.....
if ((eachline = strtok(NULL, "
")) == NULL)
eachline = tempBuffer + filesize;
}
在循环中我添加了一个条件:
while(eachline < pEndOfBuffer) {
.....
if(pEndOfBuffer[0] != ' '){
if ((eachline = strtok(NULL, "
")) == NULL)
eachline = tempBuffer + filesize;
}else{
break;
}
}
循环中的strtok执行了一次,所以似乎破坏了内存。我说似乎是因为从逻辑上看,它不需要在最后一次迭代中执行最后一次pEndOfBuffer以 0开头,因为strtok null终止了令牌。我不认为我需要一个工具来指出损坏的内存,如果我修复代码逻辑,它不会崩溃。
虽然探索发现某处写的,因为strtok修改了原始字符串,你应该在副本上工作。他们用strdup制作副本。当我尝试它不起作用。我无法理解,如果我使用副本,原件会删除,但副本仍然必须删除,如果它破坏了原来的方式,它将如何帮助。无论如何,除了我得到的2个负面点之外,好的结果很好:(谢谢
以上是关于内存损坏问题的主要内容,如果未能解决你的问题,请参考以下文章
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段