设为首页 加入收藏

TOP

C++中内存访问越界出现的奇怪问题
2014-11-23 21:46:39 来源: 作者: 【 】 浏览:10
Tags:内存 访问 越界 出现 奇怪 问题
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 
 

因为是公司内部的代码,所以不能贴出详细的代码。
上面的代码运行时,会在1)处访问超出数组buffer的边界,因为在C++中数组下标时从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++中出现内存访问越界时,有可能会立即报错,也有可能在下一次/下下一次(在它的附近)
的内存访问(new or delete)时会报错,但是这时报出来的错误已经面目全非了。
所有像这种问题,还是需要仔细看代码的。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj3348 Cows 凸包+多边形面积 水.. 下一篇二叉排序算法(稳定 最小交换次数..

评论

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

·一篇说人话的文章, (2025-12-27 07:50:09)
·Python Web框架哪家 (2025-12-27 07:50:06)
·基于Python的数据分 (2025-12-27 07:50:03)
·深入理解 Java 集合 (2025-12-27 07:22:48)
·Java集合框架全面解 (2025-12-27 07:22:45)