C++ 内存损坏问题

C++ 内存损坏问题,c++,memory,C++,Memory,在我的应用程序中,我正在创建文件的链接列表。我在每个节点的缓冲区中为这些文件的内容分配空间,然后从文件缓冲区中的key=Value对中提取值信息并放入数组: 代码逻辑如下所示: 对文件夹中的所有文件重复以下操作 { fileLinkedList->pFileContentBuffer= new unsigned char[sizeofthefileinbytes] ... } 所以我现在分配了缓冲区 下一步: 对于某些文件(在单独的行上具有key=value对的文件),重复此步骤

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

代码逻辑如下所示:

对文件夹中的所有文件重复以下操作

{
    fileLinkedList->pFileContentBuffer= new unsigned char[sizeofthefileinbytes]
...
}
所以我现在分配了缓冲区

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

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;
}
这会传递几个文件,然后崩溃。所有文件的大小和格式都相似。它崩溃于:

free():下一个大小无效(正常):0x08895cd8***

请检查上面的代码逻辑,让我知道代码逻辑或任何方法或工具有问题,以检测内存损坏,如果它正在发生


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

那么问题似乎在于循环中最后一次调用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;
}
。。。
pEndOfBuffer=tempBuffer+filesize-2//就在上次CR和LF之前
....
eachline=strtok(tempBuffer,“\n\r”)//我看到这修改了tempBuffer,但是
//将1字节CR替换为1字节\0 so
//看起来不像是导致溢出
.....
while(每条线
在循环中,我添加了一个条件:

while(eachline < pEndOfBuffer) {
       .....
       if(pEndOfBuffer[0] != '\0'){
        if ((eachline = strtok(NULL, "\n\r")) == NULL)
             eachline = tempBuffer + filesize;
       }else{
         break;
       }
    }
while(每条线
循环中的strtok又执行了一次,因此似乎正在损坏内存。我这么说似乎是因为从逻辑上看,它不需要执行最后一次,而且在最后一次迭代中,pEndOfBuffer以\0开始,因为strtok null终止令牌。我不认为我需要一个工具来指出损坏的内存,如果我修复代码逻辑,它不会崩溃

在探索的过程中,我们发现有一篇文章写道,既然strtok修改了原始字符串,那么您就应该创建一个副本。他们用strdup制作了副本。当我尝试时,它不起作用。我不明白如果我使用副本,原件会被删除,但副本仍然必须被删除,如果它像原件那样腐蚀,它会有什么帮助。不管怎样,结果都很好,除了我得到的两个缺点:(
感谢< /P> C++和C是不同的语言。你清楚地使用C++,所以请不要标记C.,你有没有理由使用STD::vector?如果你切换,那么你可以去掉新的和删除。添加到@ UKMonkey,因为你使用C++使用代码> STD::String < /Cord>,停止使用Retry> char *< /Cord>字符串中的指针。QueX> StutiID[i]。Text=Malc(sisioFoValue+1);< /Cord>——这将不会使用C++编译器编译。<代码> MalOC >的返回值必须被转换为C++程序的正确指针类型。您接受的C++编译器使用什么代码?“你显然在使用C++”-看看代码,这是有争议的。除了那段错误的
new[]
delete[]
,这看起来像C代码。
while(eachline < pEndOfBuffer) {
       .....
       if(pEndOfBuffer[0] != '\0'){
        if ((eachline = strtok(NULL, "\n\r")) == NULL)
             eachline = tempBuffer + filesize;
       }else{
         break;
       }
    }