十分愚蠢的错误记录(C++创建对象时new的问题)

今天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释放内存:

 

 

 

 

posted @ 2019-11-28 03:04  略略略——  阅读(890)  评论(0编辑  收藏  举报