当内核转储错误';函数正确执行后的时间? 我写C++代码: #include <iostream> #include <queue> #include <stack> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; template <class T> class TreeNode { public: T data; TreeNode<T> *left, *right; TreeNode() { data = {}; left = right = NULL; } TreeNode(T data) { this->data = data; } }; template <class T> class BinaryTree { public: TreeNode<T> *root; vector<T> _largestIndependentSet(TreeNode<T> *root) { static unordered_map< TreeNode<T>*, vector<T> > table; if(!root) return {}; if(table.find(root) != table.end()) return table[root]; vector<T> lis = {}, lis_left = {}, lis_right = {}, lis_nrl_left = {}, lis_nrl_right = {}, lis_nrr_left = {}, lis_nrr_right = {}; // Leaf if(!root->left && !root->right) { lis.push_back(root->data); }else{ if(root->left){ lis_left = _largestIndependentSet(root->left); lis_nrl_left = _largestIndependentSet(root->left->left); lis_nrl_right = _largestIndependentSet(root->left->right); } if(root->right){ lis_right = _largestIndependentSet(root->right); lis_nrr_left = _largestIndependentSet(root->right->left); lis_nrr_right = _largestIndependentSet(root->right->right); } if( lis_left.size() + lis_right.size() > lis_nrl_left.size() + lis_nrl_right.size() + lis_nrr_left.size() + lis_nrr_right.size() + 1 ){ // don't keep root lis.insert(lis.end(), lis_left.begin(), lis_left.end()); lis.insert(lis.end(), lis_right.begin(), lis_right.end()); } else { lis.insert(lis.end(), lis_nrl_left.begin(), lis_nrl_left.end()); lis.insert(lis.end(), lis_nrl_right.begin(), lis_nrl_right.end()); lis.insert(lis.end(), lis_nrr_left.begin(), lis_nrr_left.end()); lis.insert(lis.end(), lis_nrr_right.begin(), lis_nrr_right.end()); lis.push_back(root->data); } } cout<<"Calculated Results for: "<<root->data<<": "; for_each(lis.begin(), lis.end(), [](T data) { cout<<data<<" "; }); cout<<"\n"; table[root] = lis; return table[root]; } void largestIndependentSet() { vector<T> lis = _largestIndependentSet(this->root); for_each(lis.begin(), lis.end(), [](T data) { cout<<data<<" "; }); } }; int main() { BinaryTree<int> bt; TreeNode<int> *root = new TreeNode<int>(10); root->left = new TreeNode<int>(7); root->right = new TreeNode<int>(15); root->left->left = new TreeNode<int>(9); root->left->right = new TreeNode<int>(12); root->right->left = new TreeNode<int>(6); root->right->right = new TreeNode<int>(11); root->left->left->left = new TreeNode<int>(20); root->right->left->right = new TreeNode<int>(5); root->left->left->left->left = new TreeNode<int>(22); root->left->left->left->right = new TreeNode<int>(21); root->right->left->right->left = new TreeNode<int>(4); root->right->left->right->right = new TreeNode<int>(3); bt.root = root; bt.largestIndependentSet(); return 0; }

当内核转储错误';函数正确执行后的时间? 我写C++代码: #include <iostream> #include <queue> #include <stack> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; template <class T> class TreeNode { public: T data; TreeNode<T> *left, *right; TreeNode() { data = {}; left = right = NULL; } TreeNode(T data) { this->data = data; } }; template <class T> class BinaryTree { public: TreeNode<T> *root; vector<T> _largestIndependentSet(TreeNode<T> *root) { static unordered_map< TreeNode<T>*, vector<T> > table; if(!root) return {}; if(table.find(root) != table.end()) return table[root]; vector<T> lis = {}, lis_left = {}, lis_right = {}, lis_nrl_left = {}, lis_nrl_right = {}, lis_nrr_left = {}, lis_nrr_right = {}; // Leaf if(!root->left && !root->right) { lis.push_back(root->data); }else{ if(root->left){ lis_left = _largestIndependentSet(root->left); lis_nrl_left = _largestIndependentSet(root->left->left); lis_nrl_right = _largestIndependentSet(root->left->right); } if(root->right){ lis_right = _largestIndependentSet(root->right); lis_nrr_left = _largestIndependentSet(root->right->left); lis_nrr_right = _largestIndependentSet(root->right->right); } if( lis_left.size() + lis_right.size() > lis_nrl_left.size() + lis_nrl_right.size() + lis_nrr_left.size() + lis_nrr_right.size() + 1 ){ // don't keep root lis.insert(lis.end(), lis_left.begin(), lis_left.end()); lis.insert(lis.end(), lis_right.begin(), lis_right.end()); } else { lis.insert(lis.end(), lis_nrl_left.begin(), lis_nrl_left.end()); lis.insert(lis.end(), lis_nrl_right.begin(), lis_nrl_right.end()); lis.insert(lis.end(), lis_nrr_left.begin(), lis_nrr_left.end()); lis.insert(lis.end(), lis_nrr_right.begin(), lis_nrr_right.end()); lis.push_back(root->data); } } cout<<"Calculated Results for: "<<root->data<<": "; for_each(lis.begin(), lis.end(), [](T data) { cout<<data<<" "; }); cout<<"\n"; table[root] = lis; return table[root]; } void largestIndependentSet() { vector<T> lis = _largestIndependentSet(this->root); for_each(lis.begin(), lis.end(), [](T data) { cout<<data<<" "; }); } }; int main() { BinaryTree<int> bt; TreeNode<int> *root = new TreeNode<int>(10); root->left = new TreeNode<int>(7); root->right = new TreeNode<int>(15); root->left->left = new TreeNode<int>(9); root->left->right = new TreeNode<int>(12); root->right->left = new TreeNode<int>(6); root->right->right = new TreeNode<int>(11); root->left->left->left = new TreeNode<int>(20); root->right->left->right = new TreeNode<int>(5); root->left->left->left->left = new TreeNode<int>(22); root->left->left->left->right = new TreeNode<int>(21); root->right->left->right->left = new TreeNode<int>(4); root->right->left->right->right = new TreeNode<int>(3); bt.root = root; bt.largestIndependentSet(); return 0; },c++,c++11,memory-leaks,stl,core,C++,C++11,Memory Leaks,Stl,Core,问题是递归函数\u largestIndependentSet()完成后,最后一次打印给出了正确答案。但是在那之后我得到了这个错误:中止(内核转储),并且largestIndependentSet()中的打印不会执行 这令人困惑,因为我的逻辑似乎是正确的。这是什么原因造成的 PS:如果我用c++14标记编译它,它运行良好: g++ binary_tree.cpp -std=c++14 在发布的代码中,不会出现两个以上的主要问题 T值构造函数的子指针值不确定 largestIndependen

问题是递归函数
\u largestIndependentSet()
完成后,最后一次打印给出了正确答案。但是在那之后我得到了这个错误:中止(内核转储),并且
largestIndependentSet()
中的打印不会执行

这令人困惑,因为我的逻辑似乎是正确的。这是什么原因造成的

PS:如果我用
c++14
标记编译它,它运行良好:

g++ binary_tree.cpp -std=c++14

在发布的代码中,不会出现两个以上的主要问题

  • T
    值构造函数的子指针值不确定
  • largestIndependentSet()缺少返回值
<>这些是常见的,尤其是C++初学者。确保没有留下任何不确定的值。在这种情况下,
TreeNode(T值)
构造函数中的
left
right
是不确定的

后者非常重要。函数
largestIndependentSet()
声称它正在返回一个向量,但实际上根本没有
return
。同样,它调用未定义的行为。从那里我可以推测,但请注意,这就是全部:推测:

推测:编译器愉快地生成了代码,最终将您未设置的、驻留在激活堆栈上的任何内容作为
std::vector
处理。当然,这是不确定的胡言乱语,因为您从未返回实际对象。但是调用std::vector的非虚拟析构函数肯定不知道这一点,并且在这样做的过程中,将占用它认为是其成员变量的内容的任何内容视为有效数据,而实际上它不是。它的缺点是:取随机内存,指向它的析构函数代码,对代码撒谎,说内存中有一个有效的对象,然后松开析构函数


至于为什么编译器没有出错。嗯,通常在C或C++中,做一些不明智的事情不是一个错误。编译器希望您对所做的事情有足够的了解,在本例中,不存在任何语言冲突,因此它为您提供了怀疑的好处。然而。。。在大多数现代编译器(icc、gcc、clang和msvc)上,将编译器警告级别调到迂腐的高度将警告您缺少返回值。这些警告存在是有原因的,我强烈支持将它们打开并将其视为错误(也是一个编译器选项)。

您需要显示如何创建添加到映射的指针<代码>向量v=foo(一些苹果)信息不足。如果您正在存储指向本地/临时对象的指针,那么这些指针将在某个时候变得无效。您是否尝试使用调试器单步执行代码?不是向量而是
Apple*
。存储原始指针会给您带来很多问题。我们需要看看你是如何得到那些存储在地图上的指针的。A真的很有帮助。我要做的第一件事就是将您的
TreeNode
值构造函数
TreeNode(T data)
修改为1。使用成员初始化列表和2。不要让孩子左右指针不确定;一只明显的虫子。我还修复了
largestIndependentSet
,它实际上不返回任何东西,但声称返回了。最后,源列表的大小是临界值,但imho可以作为您的复制案例发布,因此发布一个不相关的“its like this”似乎是不必要的。学习如何使用调试器将非常有用。还记得在没有
-Wall
的情况下永远不要运行gcc(添加更多的
-W
s来尝试,
-Wextra-Wpedantic-Werror
是一个很好的集合)。实际上我已经将所有指针初始化为NULL,但后来我添加了第二个构造函数,忘记了复制该行。一直做C++足够长的时间来了解这个!prakharsingh95使用成员列表初始化。这是一个好习惯,对于复杂的对象,通常是首选,因为它避免了不必要的默认初始化,
TreeNode(T const&value):data(value),left(),right(){}
g++ binary_tree.cpp -std=c++14