我的记忆是怎么回事?

What's going on with my memory?

本文关键字:怎么回事 我的记忆      更新时间:2023-10-16

我有一个函数,它为文件的大小分配了一个缓冲区

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] = ('' << 8) + '';
return (wchar_t *)dest;
}

在循环文件时,我将其作为结构的属性存储在一个值中。

我的问题似乎是,当我释放子缓冲区时,通过在结构指针数组(我的应用程序segfault)上循环来开始读取结构的标题属性。GDB告诉我,虽然它正常完成,但我认为有一堆记录丢失了。

我怀疑这与某个事物的功能范围有关。我认为getStringForSizeAndCursor中的memcpy会修复segfault,因为它在我释放之前将字节复制到子缓冲区之外。现在,我希望这些东西会被我的结构解构器清理掉,但要么事情在我预期之前就被解构了,要么一些内存仍然指向原始的子缓冲区,如果我让子缓冲区泄漏,我会得到我预期的数据,但这不是一个解决方案。

我在你的问题代码中看到的唯一明确错误是bcpy的分配太小,你分配了一个大小为size的缓冲区,并迅速将size+2字节复制到缓冲区。由于您没有在代码中使用额外的2个字节,所以只需在副本中删除+2即可。

除此之外,我只能看到一件可疑的事情,你在做;

char *subbuffer = new char[size+1];

以及将CCD_ 3字节复制到缓冲器。分配提示您正在为零终止分配额外的内存,但要么它根本不应该存在(no+1),要么您应该分配2个字节(因为您的函数提示为双字节字符集。无论哪种方式,我都看不到您将其零终止,所以将其用作零终止字符串可能会中断

@评论中的Grizzly也有道理,为字符串和wstrings分配和处理内存可能是你可以"卸载"到STL的事情,结果很好。