2014-01-22 76 views
0

我已經在這個網站上看到了一些解決方案,但沒有一個解決了我的問題。 我正在實現一個n-children,非平衡樹型和add操作給我一個例外。 的代碼如下:C++免費堆塊3da9e0在3daa08修改後被釋放

struct Node { 
    // Just to initialize the parent node to zero, default constructor 
    Node(Node *parent = 0) : m_parent(parent) { 
    } 

    Node *m_parent; 
    vector<Node *> m_children; 
    GameBoard m_currentBoard; 
}; 

當錯誤發生的事情:

Node *tempNode = 0; 

// Going through each of them to create new nodes 
for (unsigned int i = 0; i < availableBoards.size() ; i++) { 
    // Create a new node 
    tempNode = new Node; 
    tempNode->m_parent = curNode; 
    tempNode->m_currentBoard.setBoard(availableBoards[i]); 

    // This is the line when program crashes 
    curNode->m_children.push_back(tempNode); 
} 

我也曾嘗試宣告循環內的tempNode,但它並沒有幫助。

我已經通過Visual Studio的手錶檢查過,curNode不是NULL也不是tempNode

爲什麼我會收到此錯誤?

感謝您的回答。

+0

你確定'curNode'是否有效(非null並不意味着有效)?它似乎已被釋放 – UmNyobe

+0

是的,我已經雙重檢查它,我通過參數傳遞它。只有它的父項字段爲空(根節點),但子項向量的大小爲0. –

+0

「存在」並不意味着有效性。釋放內存會將舊數據保留在原來的位置,因此在調試器中它仍然看起來「有效」。 – molbdnilo

回答

0

確定問題是在調用之前破壞運行第二個代碼段的對象。它是這樣的如下:

class A{ 
    int *getAsdf(); 
    int *asdf; 
} 

int main() { 
    A *newObj = new A; 
    delete newObj; 
    newObj->getAsdf(); 
} 

我沒有一個線索,如何從以前刪除的對象調用方法。像getAsdf這樣的函數內部發生錯誤,甚至參數都是有效的。有人能解釋嗎?

+0

無效的參數就是這個指針。因爲這是一個非虛函數,所以函數調用會很好,但任何解除引用都會在無效內存上運行。對這個指針的任何寫操作(例如,將this-> asdf設置爲某個東西)都可能破壞內存管理器。 –

+0

如果我會告訴你這是一個寫得不好的代碼,它會讓你感覺好一點嗎? – SChepurin

相關問題