我的记忆是怎么回事?
What's going on with my memory?
我有一个函数,它为文件的大小分配了一个缓冲区
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的事情,结果很好。
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- qsort 不适用于我的 impl 中的浮点类型。怎么了?
- R 中的算术在数字上比整数更快。这是怎么回事?
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 对我的 c++ 金字塔分配进行小调整?我应该怎么做?
- 我找不到瓦尔格林德告诉我的记忆链接
- 我的记忆动态规划算法有什么问题?
- 我怎么知道我的服务器是否在一段时间内没有连接
- 瓦尔格林德:我的记忆泄漏在哪里
- 我的记忆是怎么回事?
- 我的记忆泄漏在哪里
- 我怎么知道我的数组在缓存中
- 为什么这个循环会破坏我的记忆
- memset 将 -1 放入我的数组中,而不是我指定的值,这是怎么回事
- 我的记忆不是免费的
- 令我惊讶的是,这段代码可以正确编译和执行。这是怎么回事?
- 我的静态函数header和.cpp是怎么回事?仅在标头中定义时运行