Hej
Jeg har nedenstående program (i meget forkortet form):
#include <iostream>
#include <map>
#include <list>
using namespace std;
template<class WeightType>
class Node {
public:
Node() {
}
~Node() {
}
};
template<class WeightType>
class TB {
public:
typedef Node<WeightType> _Node;
TB() {};
~TB() {
typename list<_Node*>::iterator iter;
_Node *temp;
iter = nodes.begin();
while (iter != nodes.end()) {
temp = (*iter);
iter = nodes.erase(iter);
delete temp;
}
}
_Node* insertNode(map<_Node*, WeightType> m1, map<_Node*, WeightType>
m2) {
_Node *result = new _Node();
nodes.push_back(result);
return result;
};
private:
list<_Node*> nodes;
};
int main(int argc, char **argv) {
Node<int> *firstNode, *secondNode, *thirdNode;
map<Node<int>*, int> weightsFrom, weightsTo;
map<Node<int>*, int>::iterator iter;
TB<int> *tb;
for (int i = 0; i < 2; i++) {
tb = new TB<int>();
weightsFrom.clear(); weightsTo.clear();
firstNode = tb->insertNode(weightsFrom, weightsTo);
secondNode = tb->insertNode(weightsFrom, weightsTo);
weightsFrom[firstNode] = 45;
weightsFrom[secondNode] = 77;
thirdNode = tb->insertNode(weightsFrom, weightsTo);
for (iter = weightsFrom.begin(); iter != weightsFrom.end(); iter++)
cout << "Weight: " << iter->second << endl;
firstNode = secondNode = thirdNode = NULL;
delete tb;
}
return 0;
}
En forekomst af TB vedligeholder altså blot en liste af knuder i en
graf. Problemet er at de to vægte, 77 og 45, i testprogrammet bliver
skrevet ud i omvendt rækkefølge anden gang for-løkken køres. Hvis jeg
udkommenterer "delete temp" i destructoren for TB, bliver de derimod
skrevet ud i samme rækkefølge begge gange. Umiddelbart ville dette ikke
undre mig, da jeg jo ikke kan vide hvilken pointer der "kommer først",
men i det fulde program kan jeg se at problemerne begynder så snart
vægtene bliver byttet om i mine maps, selvom algoritmen ikke er afhængig
af rækkefølgen. Derfor tror jeg jeg må have et eller andet
hukommelsesproblem i ovenstående testprogram, men jeg kan ikke
gennemskue hvad det skulle være.
/Andreas
|