diff --git a/gtsam/inference/BayesTree-inst.h b/gtsam/inference/BayesTree-inst.h index fdfa94d2b..0648a90f6 100644 --- a/gtsam/inference/BayesTree-inst.h +++ b/gtsam/inference/BayesTree-inst.h @@ -196,21 +196,20 @@ namespace gtsam { for (auto&& root: roots_) { std::queue bfs_queue; - // first, move the root to the queue - bfs_queue.push(root); - root = nullptr; // now the root node is owned by the queue + // first, steal the root and move it to the queue. This invalidates root + bfs_queue.push(std::move(root)); // do a BFS on the tree, for each node, add its children to the queue, and then delete it from the queue // So if the reference count of the node is 1, it will be deleted, and because its children are in the queue, // the deletion of the node will not trigger a recursive deletion of the children. while (!bfs_queue.empty()) { - // move the ownership of the front node from the queue to the current variable - auto current = bfs_queue.front(); + // move the ownership of the front node from the queue to the current variable, invalidating the sharedClique at the front of the queue + auto current = std::move(bfs_queue.front()); bfs_queue.pop(); // add the children of the current node to the queue, so that the queue will also own the children nodes. for (auto child: current->children) { - bfs_queue.push(child); + bfs_queue.push(std::move(child)); } // leaving the scope of current will decrease the reference count of the current node by 1, and if the reference count is 0, // the node will be deleted. Because the children are in the queue, the deletion of the node will not trigger a recursive // deletion of the children. diff --git a/gtsam/inference/ClusterTree-inst.h b/gtsam/inference/ClusterTree-inst.h index 2a5f0b455..1a0b4470d 100644 --- a/gtsam/inference/ClusterTree-inst.h +++ b/gtsam/inference/ClusterTree-inst.h @@ -114,20 +114,20 @@ ClusterTree::~ClusterTree() { for (auto&& root : roots_) { std::queue bfs_queue; - // first, move the root to the queue - bfs_queue.push(root); - root = nullptr; // now the root node is owned by the queue + + // first, steal the root and move it to the queue. This invalidates root + bfs_queue.push(std::move(root)); // for each node iterated, if its reference count is 1, it will be deleted while its children are still in the queue. // so that the recursive deletion will not happen. while (!bfs_queue.empty()) { - // move the ownership of the front node from the queue to the current variable - auto node = bfs_queue.front(); + // move the ownership of the front node from the queue to the current variable, invalidating the sharedClique at the front of the queue + auto node = std::move(bfs_queue.front()); bfs_queue.pop(); // add the children of the current node to the queue, so that the queue will also own the children nodes. for (auto child : node->children) { - bfs_queue.push(child); + bfs_queue.push(std::move(child)); } // leaving the scope of current will decrease the reference count of the current node by 1, and if the reference count is 0, // the node will be deleted. Because the children are in the queue, the deletion of the node will not trigger a recursive // deletion of the children. diff --git a/gtsam/inference/EliminationTree-inst.h b/gtsam/inference/EliminationTree-inst.h index 16449d0f4..3ab0e9ce4 100644 --- a/gtsam/inference/EliminationTree-inst.h +++ b/gtsam/inference/EliminationTree-inst.h @@ -197,20 +197,19 @@ namespace gtsam { for (auto&& root : roots_) { std::queue bfs_queue; - // first, move the root to the queue - bfs_queue.push(root); - root = nullptr; // now the root node is owned by the queue + // first, steal the root and move it to the queue. This invalidates root + bfs_queue.push(std::move(root)); // for each node iterated, if its reference count is 1, it will be deleted while its children are still in the queue. // so that the recursive deletion will not happen. while (!bfs_queue.empty()) { - // move the ownership of the front node from the queue to the current variable - auto node = bfs_queue.front(); + // move the ownership of the front node from the queue to the current variable, invalidating the sharedClique at the front of the queue + auto node = std::move(bfs_queue.front()); bfs_queue.pop(); // add the children of the current node to the queue, so that the queue will also own the children nodes. for (auto&& child : node->children) { - bfs_queue.push(child); + bfs_queue.push(std::move(child)); } // leaving the scope of current will decrease the reference count of the current node by 1, and if the reference count is 0, // the node will be deleted. Because the children are in the queue, the deletion of the node will not trigger a recursive // deletion of the children.