Итак, я работаю над проблемой сетевого потока и должен иметь возможность удалить правую половину моего двудольного графа, чтобы иметь дело с несколькими графами одновременно. Вот как у меня настроены классы узлов и краев:
class Node {
public:
Node();
int id;
int visited;
Node_Type type;
vector <bool> letters;
vector <class Edge *> adj; // Adjacency list
class Edge *backedge;
};
class Edge {
public:
Node *to;
Node *from;
Edge *reverse; // Edge with opposite to/from
int original; // 1 on normal
int residual; // 0 on normal
};
И потенциальный график можно увидеть на этом изображении:
Где моя цель - удалить все ребра и узлы справа от второго столбца.
У меня есть все мои узлы, организованные в векторе указателей узлов, проиндексированных слева направо/сверху вниз, и я пытаюсь пройти по этому вектору и удалить все ребра, содержащиеся в списке смежности узла, которые находятся во втором и третьем столбцах. или третий и четвертый столбцы. После чего я пройду назад и удалю узел стока, а также узлы третьего столбца, а затем, наконец, изменю размер вектора узлов, чтобы разместить только первые два столбца узлов.
Вот как я это делаю:
void DeleteHalfGraph() {
int i, j;
// Delete all edges between dice, words, and the sink
for(i = 1; i < nodes.size(); i++) {
if(nodes[i]->type == DICE) { // DICE refers to the second column of nodes
for(j = 0; j < nodes[i]->adj.size(); j++) {
if(nodes[i]->adj[j]->to->type == WORD) {
// WORD refers to the third column of nodes
delete nodes[i]->adj[j];
}
}
}
else if(nodes[i]->type == WORD || nodes[i]->type == SINK) {
// SINK refers to the 4th column of nodes
for(j = 0; j < nodes[i]->adj.size(); j++) {
delete nodes[i]->adj[j];
}
}
}
// Delete all nodes now not connected to edges
// minNodes = 5, size of the vector without the 3rd/4th columns
for(i = nodes.size() - 1; i >= minNodes; i--) {
if(nodes[i]->backedge != NULL) delete nodes[i]->backedge;
delete nodes[i];
}
nodes.resize(minNodes);
}
Ошибка, которую я получаю при компиляции:
*** Error in `./worddice': malloc(): memory corruption (fast): 0x0000000000c69af0 ***
Возможно, я просто неправильно понимаю свои указатели, поскольку в последнее время я не занимался освобождением памяти таким образом. В любом случае, где я ошибаюсь? Любая помощь приветствуется.
delete
ing узел, уменьшите и проверьте счетчик. Если ноль, перейдите кdelete
. Конечно, это означает, что вы должны увеличивать счетчик всякий раз, когда вы назначаетеNode
. Это прекрасная возможность попрактиковаться в RAII и < href="http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three">Правило трех и оберните указательNode
в объект счетчика и обойдите встречный объект. - person user4581301   schedule 14.04.2017NULL
не влияет на другие указатели. - person Barmar   schedule 14.04.2017delete
NULL. Он проверяет для вас. Ваш подход работает для предотвращения некоторых двойных удалений, но все же оставляет минное поле других узлов, которые могут попытаться перейти к этому удаленному узлу, потому что они не были отцеплены и все еще ожидают, что он будет там. Вы не хотитеdelete
узла, пока никто не связан с ним, с уважением к риску оставить цикл узлов, вырезанных из остальной части графа. - person user4581301   schedule 14.04.2017