今天C++上机课啊,就是要写个小项目实现一下二叉搜索树及其各种方法。结果在创建对象上挂掉了····回头看才发现多么弱智····现记录下来,希望永不再犯。
一共就两个类,BST类代表整颗树,里面有个根节点root,和储存结点的vector容器;另一个TreeNode类,代表树叶结点,结点数据是单独的一个int。
以下是大错特错的构造函数:
1 BST::BST() { 2 L = {22,15,60,3,25,11,50,1,27,25,49,40,53,30,19,11}; 3 for (auto it = L.begin(); it != L.end(); it++) { 4 treeVec.push_back(&TreeNode(*it)); 5 } 6 }
第四行其实根本没有创建对象······断点调试可以发现每个对象被创建后又被马上调用析构函数销毁了。为什么呢,因为这里根本没有分配内存·····
参考:https://blog.csdn.net/qq_18884827/article/details/52334303 :
c++里面, 创建对象, ClassName object(初始化参数);在Stack栈里面分配空间,自动释放。
或者用 ClassName object=new ClassNam();在heap堆里面分配空间,要手动释放。
再看:https://blog.csdn.net/cscmaker/article/details/7019977 :
从运行结果中,我们可以得出在不使用new创建对象时,对象的内存空间是在栈中的,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删除该对象。
而使用new创建对象是创建在堆中的,必须要程序员手动的去管理该对象的内存空间。
所以正确的创建叶子结点的构造函数如下:
不要忘记析构函数delete释放内存: