• 十分愚蠢的错误记录(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释放内存:

  • 相关阅读:
    6.12白书第五章图论总结——司雨寒
    【司雨寒】最短路专题总结
    十三 十四周总结
    13周总结--苏康
    JuneX_13
    12总结--苏康
    十二周总结
    每周总结(5.30)——何贤拓
    进阶实验4-3.1 家谱处理 (30分)
    进阶实验2-3.1 海盗分赃 (25分)--递推
  • 原文地址:https://www.cnblogs.com/mrlonely2018/p/11946674.html
Copyright © 2020-2023  润新知