我的记忆发生了什么?

时间:2012-10-08 16:00:41

标签: c++ memory-management memory-leaks

我有一个函数,用

为文件大小分配一个缓冲区
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泄漏我得到了我预期的数据,但是这个不是解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

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

并将size个字节复制到缓冲区。分配提示您为零终止分配额外的内存,但要么它不应该在那里(没有+1),要么你应该分配2个字节(因为你的函数提示为双字节字符集。无论哪种方式,我不能看到你终止它,所以使用它作为零终止字符串可能会破坏。

@Grizzly在评论中也有一点意义,为字符串和字符串分配和处理内存可能是你可以“卸载”到STL并获得良好结果的东西。