zoukankan      html  css  js  c++  java
  • 十分愚蠢的错误记录(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释放内存:

  • 相关阅读:
    Neo4j学习案例【转】
    Genymotion安装总结
    软件工程实践总结
    Markdown中的缩进
    Beta Daily Scrum 第七天
    随堂软工团队小测
    PMD(Put Me Down)用例测试
    第三次作业——个人作业——软件产品案例分析
    用例图
    毕设导师智能匹配
  • 原文地址:https://www.cnblogs.com/mrlonely2018/p/11946674.html
Copyright © 2011-2022 走看看