diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 85bc710b1..6637370cc 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -27,6 +27,8 @@ #include #include +#include +#include namespace gtsam { @@ -111,6 +113,25 @@ namespace gtsam { /** Copy constructor */ BayesTree(const This& other); + ~BayesTree() { + for (auto&& root: roots_) { + std::queue bfs_queue; + std::deque topological_order; + bfs_queue.push(root.get()); + while (!bfs_queue.empty()) { + Clique* current = bfs_queue.front(); + bfs_queue.pop(); + topological_order.push_front(current); + for (auto&& child: current->children) { + bfs_queue.push(child.get()); + } + } + for (auto&& clique: topological_order) { + clique->children.clear(); + } + } + } + /// @} /** Assignment operator */ diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index f72412590..6e50182c4 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -25,8 +25,7 @@ #include #include #include -#include -#include + namespace gtsam { @@ -99,28 +98,7 @@ namespace gtsam { } // Virtual destructor. - virtual ~BayesTreeCliqueBase() { - // default destructor will cause stack overflow for deletion of large trees - // so we delete the tree explicitly by first BFSing the tree to determine the topological order - // and then clearing the children of each node in topological order - // Only work in single threaded mode - std::queue bfs_queue; - std::deque topological_order; - bfs_queue.push(this); - while (!bfs_queue.empty()) { - auto node = bfs_queue.front(); - bfs_queue.pop(); - topological_order.push_front(node); - for (auto& child : node->children) { - if (child.use_count() == 1) { - bfs_queue.push(child.get()); - } - } - } - for (auto node : topological_order) { - node->children.clear(); - } - } + virtual ~BayesTreeCliqueBase() {} /// @} diff --git a/gtsam/inference/ClusterTree.h b/gtsam/inference/ClusterTree.h index a517951a0..63a1b5a96 100644 --- a/gtsam/inference/ClusterTree.h +++ b/gtsam/inference/ClusterTree.h @@ -171,18 +171,18 @@ class ClusterTree { // use default destructor which recursively deletes all nodes with shared_ptr causes stack overflow. // so for each tree, we do a BFS to get sequence of nodes to delete, and clear their children first. for (auto&& root : roots_) { - std::queue q; - std::deque nodes; - q.push(root.get()); - while (!q.empty()) { - auto node = q.front(); - nodes.push_front(node); - q.pop(); + std::queue bfs_queue; + std::deque topological_order; + bfs_queue.push(root.get()); + while (!bfs_queue.empty()) { + auto node = bfs_queue.front(); + topological_order.push_front(node); + bfs_queue.pop(); for (auto&& child : node->children) { - q.push(child.get()); + bfs_queue.push(child.get()); } } - for (auto&& node : nodes) { + for (auto&& node : topological_order) { node->children.clear(); } }