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;
}
不知道爲什麼,不知道編譯器做了什麼手腳!