Память не может быть «прочитана».- случайный сбой - PullRequest
1 голос
/ 01 октября 2010

У меня проблема со случайным падением, вызванным CSceneNode * pRoot = node [0]; // Реальная проблема = узлы [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];

In 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

In 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 ]

1 голос
/ 01 октября 2010

Если результат node->GetName() не содержит строку _Ldynamic, произойдет сбой.

Потому что в этом случае GetNodesByPartOfName(..) вернет false, а GetNodes(..) не выполнит nodes.push_back(this), и у вас останется пустой вектор, и позже он попытается получить доступ к первому элементу этого пустого вектора после возврата из * 1008. *.

1 голос
/ 01 октября 2010

Что вы хотите сделать, это убедиться, что вектор не пуст:

CSceneNode *const pRoot = nodes.empty() ? NULL : nodes[0];
if (pRoot != NULL)
{
    // Do something...
}
1 голос
/ 01 октября 2010

попробуйте использовать:

CSceneNode* pRoot = nodes.at(0);

Если вы получите исключение, значит, вы знаете, что что-то не так. Возможно, ваш фильтр слишком ограничен или у вас нет дочернего элемента, поэтому ничего не возвращается.

Не следует использовать nodes[i], если вы не уверены на 100%, что индекс i действителен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...