C++中内存访问越界出现的奇怪问题
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++中数组下标时从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)时会报错,但是这时报出来的错误已经面目全非了。
所有像这种问题,还是需要仔细看代码的。
补充:软件开发 , C++ ,