我正在尝试编写一个递归创建图形的函数。 我有一个包含所有弧和节点的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文件。