我有一个函数,用
为文件大小分配一个缓冲区char *buffer = new char[size_of_file];
i遍历缓冲区并将一些指针复制到子缓冲区以使用它的较小单位。
char *subbuffer = new char[size+1];
for (int i =0; i < size; i++) {
subbuffer[i] = (buffer + cursor)[i];
}
接下来我调用一个函数并将它传递给子缓冲区,并为子缓冲区中的一个位置传递任意光标,以及要抽象的文本大小。
wchar_t* FileReader::getStringForSizeAndCursor(int32_t size, int cursor, char *buffer) {
int wlen = size/2;
#if MARKUP_SIZEOFWCHAR == 4 // sizeof(wchar_t) == 4
uint32_t *dest = new uint32_t[wlen+1];
#else
uint16_t *dest = new uint16_t[wlen+1];
#endif
char *bcpy = new char[size];
memcpy(bcpy, (buffer + cursor), size+2);
unsigned char *ptr = (unsigned char *)bcpy; //need to be careful not to read outside the buffer
for(int i=0; i<wlen; i++) {
dest[i] = (ptr[0] << 8) + ptr[1];
ptr += 2;
}
//cout << "size:: " << size << " wlen:: " << wlen << " c:: " << c << "\n";
dest[wlen] = ('\0' << 8) + '\0';
return (wchar_t *)dest;
}
我将这个值作为结构的属性存储在循环文件中。
我的问题似乎是当我释放子缓冲区时,通过循环遍历一组struct指针,我的应用程序段错误来开始阅读我的结构的title属性。 GDB告诉我它虽然正常完成,但是我还缺少一些记录。
我怀疑这与某些功能范围有关。我认为getStringForSizeAndCursor中的memcpy会修复段错误,因为它在我释放之前将字节复制到子缓冲区之外。现在我希望那些可以被我的struct deconstructor清理掉,但是在我预期或者某些内存仍指向原始子缓冲区之前要么解构,如果我让subbuffer泄漏我得到了我预期的数据,但是这个不是解决方案。
答案 0 :(得分:0)
我在你的问题代码中可以看到的唯一明确的错误是bcpy的分配太小,你分配一个大小为size
的缓冲区并立即将size+2
个字节复制到缓冲区。由于您没有在代码中使用额外的2个字节,只需将+2放在副本中。
除此之外,我只能看到一件可疑的事情,你正在做;
char *subbuffer = new char[size+1];
并将size
个字节复制到缓冲区。分配提示您为零终止分配额外的内存,但要么它不应该在那里(没有+1),要么你应该分配2个字节(因为你的函数提示为双字节字符集。无论哪种方式,我不能看到你终止它,所以使用它作为零终止字符串可能会破坏。
@Grizzly在评论中也有一点意义,为字符串和字符串分配和处理内存可能是你可以“卸载”到STL并获得良好结果的东西。