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)时会报错,但是这时报出来的错误已经面目全非了。
所有像这种问题,还是需要仔细看代码的。