2010-10-01 6 views
1

J'ai un problème avec un crash aléatoire causé par CSceneNode * pRoot = nodes [0]; // Le vrai problème est = nodes [0]; Le message d'erreur est: L'instruction "0x0059d383" a référencé la mémoire à "0x00000000". La mémoire ne doit pas être "lue". Je ne vois pas le problème, pourrait m'aider s'il vous plaît?La mémoire ne peut pas être "lue". - crash aléatoire

Dans 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]; 

Dans 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 

Dans 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 

résolu. Merci beaucoup les gars.

+2

êtes-vous que 'nodes' n'est pas vide après' GetNodes'? – Naveen

+1

peut-être ne causant pas votre problème mais j'éviterais la construction '& string (" _Ldynamic ")' ... –

Répondre

1

Si le résultat de node->GetName() ne contient pas la chaîne _Ldynamic, cela va planter.

Parce que dans ce cas GetNodesByPartOfName(..) renvoie false et GetNodes(..) ne sera pas exécuter nodes.push_back(this) et vous vous retrouverez avec un vecteur vide et sera ensuite essayer d'accéder au premier élément de ce vecteur vide après le retour de GetNodes(..).

+0

Merci. Comment puis-je savoir qu'un vecteur est vide en C++ (je suis désolé pour cette question mais je suis si familier avec C++) – en667

+0

'vector' a une méthode' empty() '(voir http://www.sgi.com /tech/stl/Vector.html). –

1

essayez d'utiliser:

CSceneNode* pRoot = nodes.at(0); 

Si vous obtenez une exception, alors vous savez que quelque chose ne va pas. Peut-être que votre filtre est trop restrictif ou que vous n'avez pas d'enfant, donc rien n'est renvoyé.

Vous ne devez pas utiliser nodes[i] si vous n'êtes pas sûr à 100% que l'index i est valide.

1

Ce que vous voulez faire est que le vecteur est pas vide:

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