| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1943 人关注过本帖
标题:求助~~自动调用构造函数后一定要调用析构函数吗?
只看楼主 加入收藏
jimbray
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2010-1-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
求助~~自动调用构造函数后一定要调用析构函数吗?
我建立了一个二叉树,声明了一个类
--------这个是节点类的实现文件------
BiNode::BiNode(void)
:m_ndata(0),
 m_pLchild(NULL),
 m_pRchild(NULL)
{
    cout<<"BiNode构造函数\n";
}

BiNode::~BiNode(void)
{
    cout<<"BiNode 析构函数\n";
}

在二叉树类中只有一个私有成员变量是 节点类型的指针 即 BiNode* root;
在创建二叉树的函数里
-----------创建二叉树的函数-------------
void BiTree::creatTree(){
    cout<<"请输入字符创建二叉树\n";
    char data;
    int rear,front;
    rear = 0;
    front = 1;
    BiNode* Q[Maxsize];
    BiNode* node;
    //BiNode* root;
    cin>>data;
    while(data != '$'){
        if(data != '@'){
            node = new BiNode();  //这句会调用BiNode 的构造函数,屏幕打印构造函数....
            node->m_pLchild = NULL;
            node->m_pRchild = NULL;
            node->m_ndata = data;
        }
        rear++;
        Q[rear] = node;
        if(rear == 1) root = node;
        else{
            if(node && Q[front]){
                if(rear % 2 == 0) Q[front]->m_pLchild = node;
                else Q[front]->m_pRchild = node;
                if(rear % 2 == 1) front++;
            }
        }
        cin>>data;
    }
}

------main函数-------
int _tmain(int argc, _TCHAR* argv[])
{
    BiTree myTree;
    //BiNode* root;
    //root = myTree.creatTree();
    myTree.creatTree();
    myTree.inorder(myTree.root);
    delete myTree.root;//这个只是释放了根节点吧,那些子树的内存怎么释放呢?
    system("pause");
    return 0;
}

在函数里我有调用到构造函数,但是那个是我新建的节点,不能删除的,所以不用BiNode的析构函数吧?但是它不会自己调用吗?
应该要在程序退出后释放资源吧...但是我新建了好多个BiNode 怎么一个个释放呢? 还是只释放一个就好了?

小弟初学,求高人指教~~

[ 本帖最后由 jimbray 于 2010-4-17 14:10 编辑 ]
搜索更多相关主题的帖子: 函数 构造 自动 
2010-04-17 13:59
jimbray
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2010-1-16
收藏
得分:0 
没人来~~顶~~
2010-04-17 14:14
jimbray
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2010-1-16
收藏
得分:0 
还是没人,我觉得当程序退出时,全部的节点空间都应该释放。所以,现在问过一个问题,有没有人写过递归删除二叉树?
2010-04-17 17:00
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:5 
main()是整个EXE入口
程序被结束后main()也被结束,main()一旦被结束,系统核心会调用一系列动作删除内存和硬盘记忆(虚拟内存)
作用如同~main()
类的生命期永远超不过main(),所以类超出生命期后,解析函数自动调用.

至于你说的什么树,你把整个类想像成树的一个节点,无数个节点无数个类,每个节点都的解析都互不相关(我说过自动调用)
如果做的好,每个类的解析都自己做好自己份内的事.顶点被删除了,每个节点都会自己删除
2010-04-17 20:32
YZAM
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2010-3-29
收藏
得分:5 
如果不定义析构函数 编译系统会自动生成一个默认的析构函数
2010-04-17 20:42
jimbray
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2010-1-16
收藏
得分:0 
每个节点会自动删除吗?不是要自己在析构函数里写一些代码还实现?我现在做好了,但是我在建树的时候有新建了几个节点,但是自动调用析构函数只会删除根节点,那样的话不就会有内存泄露的问题了?求解~~(我自己写了整个树的删除~~)
2010-04-17 22:04
wylzjcw
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:185
专家分:174
注 册:2009-1-4
收藏
得分:10 
BiNode::~BiNode(void)
{
    DeleteBTree(); //自己写的整个树的删除函数放在析构函数里
    cout<<"BiNode 析构函数\n";
}

勾股定理用相似三角形证明最合理
2010-04-17 22:37
jimbray
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2010-1-16
收藏
得分:0 
我就是这样写的,嘻嘻~~也就是说要手动地在析构函数里删除二叉树了......了解,稍微明白了点,谢谢大家的解答~~
2010-04-17 22:53
快速回复:求助~~自动调用构造函数后一定要调用析构函数吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022633 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved