内存无法“读取”。 - 随机崩溃

时间:2010-10-01 12:40:10

标签: c++ windows

我遇到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

解决。非常感谢你们。

3 个答案:

答案 0 :(得分:1)

尝试使用:

CSceneNode* pRoot = nodes.at(0);

如果你得到例外,那你就知道出了什么问题。也许你的过滤器限制太多,或者你没有孩子,所以没有任何回报。

如果您不是100%确定nodes[i]索引有效,则不应使用i

答案 1 :(得分:1)

如果node->GetName()的结果不包含字符串_Ldynamic,则会崩溃。

因为在这种情况下GetNodesByPartOfName(..)将返回false并且GetNodes(..)将不会执行nodes.push_back(this)并且您将留下一个空向量,稍后将尝试访问此空的第一个元素从GetNodes(..)返回后的矢量。

答案 2 :(得分:1)

您要做的是确保向量不为空:

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