2010-10-01 70 views
1

我遇到由CSceneNode * pRoot = nodes [0]引起的隨機崩潰問題; //真正的問題是= nodes [0]; 崩潰消息是:「0x0059d383」處的指令引用「0x00000000」處的內存。內存不會被「讀取」。 我看不到問題,請幫我解決問題?內存不被「讀取」。 - 隨機崩潰

在Save.cpp

void CNESave::SaveLocation(CNELocation* pLoc) 
// Other code 

    CSceneNode* scene = pLoc->GetScene(); 
    vector<CSceneNode*> nodes;   
    scene->GetNodes(GetNodesByPartOfName, nodes, &string("_Ldynamic")); 
    CSceneNode* pRoot = nodes[0]; //This is the problem causing random crashes! 
     // If I change it (just for testing) to CSceneNode* pRoot = scene 
     // them it isn't crashing. 
     // So CSceneNode* pRoot is OK and the problematic part is = nodes[0]; 

在SceneNode.cpp

bool GetNodesByPartOfName(CSceneNode* node, const void *data) 
{ 
    string *str = (string *)data; 
    return node->GetName().find(*str)!=npos; 
} 

void CSceneNode::GetNodes(GetNodesFunc gf, vector<CSceneNode*> &nodes, 
    const void *data) 
{ 
    if (gf(this, data)) nodes.push_back(this); 
    SceneNodeIterator begin=FirstChild(), end=LastChild(); 
    for (;begin!=end;begin++) ((CSceneNode*)*begin)->GetNodes(gf, nodes, data); 
} 

CSceneNode* CSceneNode::CreateNew() 
{ 
    return new CSceneNode(); 
} 

// a lot of other code 

在SceneNode.h

class EXPORTDECL CSceneNode; 
typedef bool (*GetNodesFunc)(CSceneNode *node, const void *data); 
EXPORTDECL bool GetNodesByPartOfName(CSceneNode* node, const void *data); 
typedef vector<CSceneNode*>::iterator SceneNodeIterator; 
class EXPORTDECL CSceneNode : public CTreeNode<CSceneNode, true> 
{ 
public: 
//construction & destruction 
    CSceneNode(); 
    virtual ~CSceneNode(); 
    virtual CSceneNode *CreateNew(); 
// a lot of other code 

解決。非常感謝你們。

+2

你肯定'nodes'後'GetNodes'是不是空的? – Naveen 2010-10-01 12:45:09

+1

可能不會導致你的問題,但我會避免'&string(「_Ldynamic」)'構造... – 2010-10-01 12:45:26

回答

1

如果node->GetName()的結果不包含字符串_Ldynamic,則會崩潰。

因爲在這種情況下GetNodesByPartOfName(..)將返回FALSE,GetNodes(..)將不執行nodes.push_back(this),你將留下一個空載體和以後將嘗試從GetNodes(..)返回後訪問此空載體的第一要素。

+0

謝謝。如何在C++中發現一個向量是空的(我對這個問題感到抱歉,但我對C++非常熟悉) – en667 2010-10-01 12:54:42

+0

'vector'有一個'empty()'方法(參見http://www.sgi.com /tech/stl/Vector.html)。 – 2010-10-01 13:01:42

1

嘗試使用:

CSceneNode* pRoot = nodes.at(0); 

如果你得到一個異常,那麼你知道什麼是錯的。也許你的過濾器太嚴格了,或者你沒有孩子,所以沒有任何回報。

如果您不是100%確定i索引有效,則不應使用nodes[i]

1

你想要做的就是確保向量不爲空:

CSceneNode *const pRoot = nodes.empty() ? NULL : nodes[0]; 
if (pRoot != NULL) 
{ 
    // Do something... 
}