错误。访问违规写入位置

时间:2013-11-24 23:46:58

标签: c++ qt memory graph malloc

我正在尝试编写一个递归创建图形的函数。 我有一个包含所有弧和节点的SQLite DB。 这是我的功能:

Node* Graph::addNode(QString id)
{
    QSqlQuery nodeQuery;
    Node* newNode = NULL;
    QString nodeQ = "SELECT n.node_id, a.id AS road_id, a.cost AS cost FROM roads_nodes AS n JOIN roads AS a ON (a.node_from = n.node_id OR a.node_to = n.node_id) WHERE n.node_id = " + id + " ORDER BY n.node_id";
    nodeQuery.exec(nodeQ);
    QSqlRecord nodeRec = nodeQuery.record();
    while(nodeQuery.next())
    {
        newNode = new Node(id);
        vNodes.insert(id, newNode);

        QString arcId = nodeQuery.value(nodeRec.indexOf("road_id")).toString();
        double arcCost = nodeQuery.value(nodeRec.indexOf("cost")).toDouble();
        Arcs* arc = new Arcs(arcId,arcCost, NULL, NULL);

        QString arcQ = "SELECT  \"node_from\", \"node_to\" FROM \"roads\" WHERE id = " + arcId;
        QSqlQuery arcQuery;
        arcQuery.exec(arcQ);
        QSqlRecord arcRec = arcQuery.record();

        arcQuery.next();
        QString node_from = arcQuery.value(arcRec.indexOf("node_from")).toString();
        QString node_to = arcQuery.value(arcRec.indexOf("node_to")).toString();

        if (vNodes.contains(node_from))
            arc->node_from = vNodes.find(node_from).value();
        else
            arc->node_from = addNode(node_from);//create Node

        if(vNodes.contains(node_to))
            arc->node_to = vNodes.find(node_to).value();
        else
            arc->node_to = addNode(node_to);//createNode
        uArcs.insert(arcId,arc);
    }
    return newNode;
}

这是我使用的课程:

class Arcs
{
public:
    Arcs(QString id, double cost, Node* node_from, Node* node_to ):id(id), cost(cost), node_from(node_from), node_to(node_to){}
    ~Arcs();
    QString id;
    double cost;
    Node* node_from;
    Node* node_to;
};

class Node
{
public:
    Node(QString id):id(id){}
    ~Node();
    QString id;
};
class Graph
{
public:
    Graph();
    ~Graph();

    QSqlDatabase *sdb;

    int NodeCount;
    int ArcsCount;

    QHash<QString,Node*> vNodes;
    QHash<QString,Arcs*> uArcs;
    Node* addNode(QString);
};

所以一切都在没有任何警告的情况下成功构建,等等。 它运行并且有一次它因这样的错误而崩溃:

  

roadNetwork.exe中0x7c90e8c5的第一次机会异常:0xC0000005:访问冲突写入位置0x011e0f94。

     

roadNetwork.exe中0x7c90e8c5处的未处理异常:0xC0000005:访问冲突写入位置0x011e0f94。

说实话,我试过在网上读到这个问题,但我没有找到任何有用的提示。 实际上,我已经尝试调试此代码,当虚拟内存使用量达到96-102mb边缘时它会崩溃。调试器向我显示malloc.h文件。

0 个答案:

没有答案