[轉貼]new 一個數組,然後對數組pp越界訪問,delete []pp 時出錯,爲什麼?

 

樓主yaoyansi()2006-11-16 20:58:00 在 C/C++ / C++ 語言 提問

new   一個數組,然後對數組pp越界訪問,delete   []pp   時出錯,爲什麼?  
    void   main()  
  {  
      int   *pp=new   int[3];  
   
    *(pp+0)=0;  
    *(pp+1)=1;  
    *(pp+2)=2;  
   
    *(pp+3)=3;  
    cout<<   "-----   "   <<       *(pp+0)<<       *(pp+1)<<       *(pp+2)<<       *(pp+3)   <<endl;  
    cout<<   "-----   "   <<       *(pp+3)<<endl;  
   
    //delete   []   pp;   沒有這句話時   程序可以正常結束  
   
  }  
   
  void   main()  
  {  
      int   *pp=new   int[3];  
   
    *(pp+0)=0;  
    *(pp+1)=1;  
    *(pp+2)=2;  
   
    *(pp+3)=3;  
    cout<<   "-----   "   <<       *(pp+0)<<       *(pp+1)<<       *(pp+2)<<       *(pp+3)   <<endl;  
    cout<<   "-----   "   <<       *(pp+3)<<endl;  
   
    delete   []   pp;//程序運行到這裏時會出錯   爲什麼呢?編譯器是怎麼做的?  
   
  }  
  問題點數:10、回覆次數:37Top

 

1 樓yaoyansi()回覆於 2006-11-16 21:00:55 得分 0

偶用的是vc6Top

4 樓weixing979(★★★閃電俠★★★)回覆於 2006-11-16 21:19:56 得分 3

內存中可以看到初始化爲   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   FD   FD   FD   FD   (在第一個CD前也有   FD   FD   FD   FD)  
    0xFD(   deFencde   Data   )   初始化受保護的內存(debug   版在動態分配內存的前後加入保護內存以防止越界訪問)  
  而你的   *(pp+3)=3;   正好把   FD   FD   FD   FD   這改爲了03   00   00   00   ,應該是刪除這的時候導致出錯Top

7 樓alainpro(Alain)回覆於 2006-11-16 22:41:33 得分 3

weixing979(★★★閃電俠★★★)   正解  
  我在VC裏F5調試你的程序,DEBUG記錄裏有這麼一段:  
  memory   check   error   at   0x00371EDC   =   0x03,   should   be   0xFD.  
  memory   check   error   at   0x00371EDD   =   0x00,   should   be   0xFD.  
  memory   check   error   at   0x00371EDE   =   0x00,   should   be   0xFD.  
  memory   check   error   at   0x00371EDF   =   0x00,   should   be   0xFD.  
  Top

9 樓gkisme(Fighting Dreamer)回覆於 2006-11-16 22:46:05 得分 0

餓,果然如weixing979(★★★閃電俠★★★)所說,跟蹤的話會發現錯誤是發生在*(pp+3)=3;  
  而不是delete那裏Top

 

yaoyansi()回覆於 2006-11-17 11:22:07 得分 0

 

 
  諸位是如何在vc下查看內存分佈的啊?  
  Top

15 樓weixing979(★★★閃電俠★★★)回覆於 2006-11-17 12:00:28 得分 2

先在某行打上斷點,然後F5,調試時   View   --   Debug   Windows   --   MemoryTop

16 樓yaoyansi()回覆於 2006-11-17 12:30:17 得分 0

多謝諸位的指點,剛纔也和同學討論了一下,也看了內存分佈,總算明白了一些。      
    
  void   main()  
  {  
  int   *pp=new   int[3];  
  //內存分佈:  
  //   (受保護的內存標誌)---pp----------------------------------------(受保護的內存標誌)  
  //   ------|--------------|-----------------------------------------|  
  //   ------FD   FD   FD   FD----CD   CD   CD   CD---CD   CD   CD   CD---CD   CD   CD   CD---FD   FD   FD   FD  
   
   
  *(pp+0)=0;  
  //   (受保護的內存標誌)---pp---------------------------------------(受保護的內存標誌)  
  //   ------|--------------|----------------------------------------|  
  //   ------FD   FD   FD   FD----00   00   00   00---CD   CD   CD   CD---CD   CD   CD   CD--FD   FD   FD   FD  
   
   
  *(pp+1)=1;  
  //   (受保護的內存標誌)---pp---------------------------------------(受保護的內存標誌)  
  //   ------|--------------|-----------------------------------------|  
  //   ------FD   FD   FD   FD----00   00   00   00---01   00   00   00---CD   CD   CD   CD---FD   FD   FD   FD  
   
   
  *(pp+2)=2;  
  //   (受保護的內存標誌)---pp---------------------------------------(受保護的內存標誌)  
  //-------|--------------|----------------------------------------|  
  //------FD   FD   FD   FD----00   00   00   00---01   00   00   00---02   00   00   00---FD   FD   FD   FD  
   
   
  *(pp+3)=3;  
  //   (受保護的內存標誌)       pp                                                                              
  //   ------|--------------|  
  //   ------FD   FD   FD   FD----00   00   00   00---01   00   00   00---02   00   00   00---03   00   00   00  
   
   
  cout<<   "-----   "   <<   *(pp+0)<<   *(pp+1)<<   *(pp+2)<<   *(pp+3)   <<endl;  
  cout<<   "-----   "   <<   *(pp+3)<<endl;  
   
  delete   []   pp;//程序運行到這裏時會出錯   爲什麼呢?編譯器是怎麼做的?  
  //   (受保護的內存標誌)       pp                                                                              
  //   -----|---------------|                                                                                  
  //   -----FD   FD   FD   FD-----00   00   00   00----01   00   00   00----02   00   00   00----03   00   00   00  
   
  只找到了“受保護的內存標誌”的起始位置,另外一個“受保護的內存標誌”找不到了。  
  應該是因此而出錯的吧  
  Top

19 樓dongbicheng1983()回覆於 2006-11-17 12:42:52 得分 0

數組最後一位是受保護的..Top

22 樓39457760(人間一日,網上一年◎分要多多的給,貼要慢慢的結)回覆於 2006-11-17 13:42:30 得分 0

數組最後一位是受保護的..  
  ====================  
  不是這樣  
  vc的debug版本會做檢測  
  release版本看到這種錯誤提示Top

23 樓AVRobust(心鏡止水)回覆於 2006-11-17 13:55:38 得分 0

對   樓上正解  
  debug檢測  
  Top

26 樓akirya(壞[其實偶不是什麼所謂的壞人])回覆於 2006-11-17 15:02:24 得分 0

debug   在new出的內存最後有檢測。Top

33 樓playboy1983()回覆於 2006-11-17 18:01:19 得分 2

好像   不是那樣   如果把*(pp+4)的內容在填充成fd的話仍然有錯誤,期待正解Top

35 樓yaoyansi()回覆於 2006-11-20 09:47:31 得分 0

回覆人:playboy1983()   (   一級(初級))   信譽:100   2006-11-17   18:01:20   得分:0  
  ?    
   
  好像   不是那樣   如果把*(pp+4)的內容在填充成fd的話仍然有錯誤,期待正解  
  ------------------------------------------------------------------------------------  
  強人!  
   
  偶試了一下,給*(pp+4)填充0Xfdfdfdfd後,在delete時還是會出錯。  
   
  {  
  int   *pp=new   int[3];  
   
    *(pp+0)=0;  
    *(pp+1)=1;  
    *(pp+2)=2;  
   
    *(pp+3)=3;  
   
    *(pp+4)=0xfdfdfdfd;  
  }  
   
  不知道爲什麼,不知道編譯器做了什麼手腳!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章