2010-10-01 119 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... 
}