程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中內存訪問越界出現的奇怪問題

C++中內存訪問越界出現的奇怪問題

編輯: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)時會報錯,但是這時報出來的錯誤已經面目全非了。 所有像這種問題,還是需要仔細看代碼的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved