2012-02-23 60 views
1

我的程序崩潰,指針無效。當我用它運行gdb時,它告訴我導致崩潰的無效指針的地址。它崩潰上線是一個刪除指針崩潰無效,但指針不同

delete some_pointer; 

但是,當我用鼠標右鍵刪除之前打印出來的指針,作爲一個GDB告訴我是無效的地址是不一樣的。那麼,當它崩潰而不是導致問題的指針時,我正在刪除some_pointer? GDB說 -

free(): invalid pointer: 0xbfffea84 *** 

那麼,爲什麼它的每一次崩潰上自由使用不同的地址?我只想確保我在這裏正確思考。

+4

爲什麼在使用'delete'時標記'C'? – cnicutar 2012-02-23 18:58:22

+1

'some_pointer'的類型是什麼? – 2012-02-23 18:58:40

+0

地址在每次運行中都會有所不同。所有地址都是。 – pmr 2012-02-23 18:58:53

回答

0

幾乎可以肯定,指針是delete d之前你正在查看刪除。刪除指針兩次會導致所描述的症狀。

+1

但即使我刪除了兩次,它不應該仍然有相同的地址? – Sterling 2012-02-23 19:16:31

+0

@Sterling:我不會把太多的重量放在實際的指針值上。首先,它看起來像指針變量的地址 - 不是指針值(內容)。其次,第一次刪除是成功的,所以你可能不知道當時的價值。第三,可能已經分配了另一個指針值;沒有看到一些代碼,這一定是假設性的猜測。第四,指針值可能因運行而異,原因很多:隨機性(無論是有意的還是對環境的反應)或SELinux原因(隨機化內存佈局)。 – wallyk 2012-02-23 19:23:11

0

如果你有這樣的事情:

struct S 
{ 
    int* p; 
    ~S() { delete p;} 
}; 

S* s; 
std::cout << (void*)s; 
delete s; 

可能,同時刪除p你的程序會崩潰,但s將被打印出來。他們可能會有所不同。

0

如果您有一個具有多重繼承的類,地址將根據指針的類型進行調整。 free將需要使用基本類型,但編譯器應該能夠在場景後方無形地進行適當的轉換。