2012-04-14 37 views
2

我們有一個類來表示一個非常大的應用程序列表:無效指針強制應用程序崩潰

CSMLNode 
{ 
    CSMLNode *pChild; 
    CSMLNode *pSibling; 

    CSMLNode() 
    { 
    pChild = NULL; 
    pSibling = NULL; 
    }   
} 

爲了優化,創造了被關在一個游泳池和反覆使用的壽命的節點對象應用。節點對象僅在節點對象的數量超過特定計數時才被釋放。當節點對象釋放到池中或從池中取出時,值pChildpSibling未設置爲NULL。我們認爲這會導致應用程序崩潰。

我打算將pChild和pSibling的值設置爲0xDDDDDDDD,如果從池中獲取節點對象時其值不爲NULL。當從池中取出節點對象後,訪問pChildpSibling指針時沒有將適當的對象指針設置爲pChildpSibling,我的強化就是強制性地使應用程序崩潰。

這個工作是否符合我的預期?如果沒有,我應該給予強制訪問違規的指針值。

我已啓用整頁堆以儘早獲取訪問衝突。

+3

阻止您在發佈過程中將指針設置爲NULL嗎? – 2012-04-14 07:18:50

+0

我不確定。我們正在分析 – Maanu 2012-04-14 07:20:33

+0

爲什麼不在創建對象時將這些指針設置爲適當的值(NULL或適當的其他位置),而與是否在發佈時將它們設爲空值無關。你的構造函數不應該讓你使用隨機內存。 – 2012-04-14 14:47:15

回答

4

Visual Studio調試CRT已經這樣做了。你從堆中分配的內存被初始化爲0xcdcdcdcd。由於你的結構包含指針,取消引用未初始化的指針會自動生成一個AV。調試堆初始化值爲documented here

你不需要幫忙。避免保留自己的游泳池,CRT在Windows低碎片堆的幫助下已經做得很好。如果你想保留它,那麼我建議你使用與調試CRT相同的方法。不要跳過它所做的一切,無人區域是早期檢測內存損壞的絕佳方法。

0

它調用未定義的行爲,這可能會或可能不會崩潰您的應用程序。它也可能做其他不需要的事情。

即使只是將值0xDDDDDDDD作爲指針存儲(不解除它)也是未定義的行爲。

+0

我不明白你的意思 – Maanu 2012-04-14 07:17:08

+0

@Maanu - 某些硬件有專用的地址寄存器來驗證指針。只要將一個無效值加入其中一個就可以殺死你的程序。所以這個語言說它沒有定義。 – 2012-04-14 10:14:26

+0

@Maanu:我認爲問題是未定義的行爲可能會導致程序的繼續執行。 – suszterpatt 2012-04-14 14:51:50

相關問題