我用C++编写下面的代码来提取Piece Table数据结构中给定范围的文本。下面是类PieceTable的存储文本的给定范围中的字符数组buffer
在功能:可能的缓冲区溢出问题
void PieceTable::getTextInRange(unsigned __int64 startPos, unsigned __int64 endPos, char buffer[]){
char* totalBuffer = new char[getSize() + 2];
getBuffer(totalBuffer);
if(endPos >= getSize())
endPos = getSize() - 1;
cout<<"startPos : "<<startPos<<endl;
cout<<"endPos : "<<endPos<<endl;
memcpy(buffer, &totalBuffer[startPos], endPos - startPos + 1);
buffer[endPos - startPos + 2] = '\0';
if(totalBuffer != 0)
delete[] totalBuffer;
totalBuffer = 0;
}
此处在主方法的代码段,其我使用来测试该代码:
temp2 = new char[end - start + 2]; //changing 2 to 3 solves the problem
pieceTable.getTextInRange(Start, end, temp2);
for(int i = 0; i< end - start + 1; i++)
cout<<temp2[i];
cout<<endl;
if(temp2 != 0)
{
delete[] temp2; //this line causes the heap corruption error
temp2 = 0;
}
宣言temp2
: char* temp2;
每当程序遇到delete[] temp2
说法,有一个堆损坏错误。如果我为temp2分配内存,则不会发生此问题:
temp2 = new char[end - start + 3]
因此,基本上更改长度可解决问题。我知道我在某处弄乱了这些长度,但我无法弄清楚在哪里。
编辑: 的getSize():
__int64 PieceTable::getSize()
{
return dList.getLength(dList.getBack());
}
我使用了一块表数据结构。这是它,在本文中:http://www.cs.unm.edu/~crowley/papers/sds.pdf
我可能是错的,但我不认为有任何问题getSize()
,因为我用来检索整个缓冲区的长度的函数getBuffer
的工作方式如代码所示。
打印'getSize()+ 2'的返回值以及'endPos - startPos + 2'的值,以确保前者大于后者。 –
实际上,'getSize()+ 2'用于变量'totalBuffer',它是函数'getTextInRange'中的局部变量。 – devjeetroy
你最初的分配是什么? – Vlad