设为首页 加入收藏

TOP

C++中内存访问越界问题
2013-09-26 19:50:37 来源: 作者: 【 】 浏览:103
Tags:内存 访问 越界 问题

  我们在C++(www.cppentry.com)中有时会出现内存访问越界出现的奇怪问题

  int fd;

  int size = 0;

  int bytes = 0;

  if (openFile(filename, fd, size)) {

  char* buffer = new char[size];

  if ((bytes = ::read(fd, buffer, size))) { ...}

  for (int i=0; i<bytes; i++) {

  if (i==(bytes-1)) {

  1) buffer[i+1] = '\0'; //这里数组越界

  }

  ...

  2) string fileStr(linePointer);

  }

  ...

  3) delete[] buffer;

  }

  因为是公司内部的代码,所以不能贴出详细的代码。

  上面的代码运行时,会在1)处访问超出数组buffer的边界,因为在C++(www.cppentry.com)中数组下标时从0开始的,所有array[array.length]会越界。

  但是在具体的运行时,会出现奇怪的问题。

  有时会在2)处抛出:

  *** glibc detected *** program: malloc(): memory corruption (fast): 0x00002aaabd0c3650 ***

  ======= Backtrace: =========

  /lib64/libc.so.6[0x3e99a73b1c]

  /lib64/libc.so.6(__libc_malloc+0x6e)[0x3e99a74e4e]

  /usr/lib64/libstdc++.so.6(_Znwm+0x1d)[0x3e9eabd1dd]

  /usr/lib64/libstdc++.so.6(_ZNSs4_Rep9_S_createEmmRKSaIcE+0x21)[0x3e9ea9b861]

  /usr/lib64/libstdc++.so.6[0x3e9ea9c365]

  /usr/lib64/libstdc++.so.6(_ZNSsC1EPKcRKSaIcE+0x42)[0x3e9ea9c512]

  ...

  有时会在3)处抛出:

  *** glibc detected *** program: double free or corruption (!prev): 0x0000000018553af0 ***

  ======= Backtrace: =========

  /lib64/libc.so.6[0x3e99a7247f]

  /lib64/libc.so.6(cfree+0x4b)[0x3e99a728db]

  ...

  刚开始的时候,像这种同一个代码段,在运行多次时,会在不同的地方出错,我以为时多线程问题,

  后来一看代码,根本就没有多线程,所有否定。

  再仔细看代码下,发现错误,内存访问越界。

  所有我猜测,当C++(www.cppentry.com)中出现内存访问越界时,有可能会立即报错,也有可能在下一次/下下一次(在它的附近)

  的内存访问(new or delete)时会报错,但是这时报出来的错误已经面目全非了。

  所有像这种问题,还是需要仔细看代码的。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇字符串四则运算的实现 下一篇二叉排序算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: