请问容器嵌套如何释放空间?

DeDeWo 2012-12-03 07:40:53
例如:
struct node{
string s; //本节点内容
list<node> child; //若干个子节点
};

node root;

那么这是一棵树,如果要删除某个节点,应该只能是自己写个递归的代码吧。

如果是下面这样:
struct node{
~node(){ s.~string(); }
string s; //本节点内容
list<node> child; //若干个子节点
};

node root;

比如删除root,是否只需要调用 root.~node() 呢?
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
DeDeWo 2012-12-03
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
#include<list>
using namespace std;

const int MM=100000;

struct node{
       node(){}
       node(string _v):v(_v){}
       ~node(){}
       string v; //
       list<node> child; //
};

node v;

int main(){
    
    node *temp ;
    temp= &v;
    for(int i=0;i<5;++i){        
        for(int j=0;j<MM;++j){
            string a="aa";
            temp->child.push_back(a);
        }
        temp = &*temp->child.begin();   
        
        system("pause");  
    } 
    
    cout<<"释放:"<<endl;
    v.~node();  
    
    
    system("pause");
    return 0;
}

/*
     打开任务管理器可以监测内存的变换情况:
     
     for循环中,内存占用是不断增加的,
     
     调用 v.~node()后,内存减小到初始值。 (这里有疑问,析构函数中什么都没有,是如何析构的?) 
     
     但程序结束时报错。 
     
     显示 “0x004317b"指令引用的”0x00ff77b0" 内存。该内存不能为 "read"  。
     
     这是肿么回事? 

*/ 

DeDeWo 2012-12-03
  • 打赏
  • 举报
回复
void destroy(node &rt){ //删除 rt 所有的孩子 for(list<node>::iterator It=rt.child.begin(); It!=rt.child.end(); ++It) destroy(*It); rt.child.clear(); } 就这个而言,执行 rt.child.clear()时,rt.child 本身就是空的,这就没意义啊。 直接调用 root.child.clear() 可否?那么这样的话,结点里面的内容string s怎么办?会自动调用 string s的析构函数么
DeDeWo 2012-12-03
  • 打赏
  • 举报
回复
是不是像下面这样?是否还有注意一下其他方面?

#include<iostream>
#include<string>
#include<list>
using namespace std;
struct node{
       friend bool operator == (const node &a,const node &b){ //重载等于号 
              return a.s == b.s;
       }
       string s;           //本节点内容 
       list<node> child;   //若干个子节点 
}; 

void destroy(node &rt){ //删除 rt 所有的孩子 
     for(list<node>::iterator It=rt.child.begin(); It!=rt.child.end(); ++It)
         destroy(*It);
     rt.child.clear();
}

node root;

int main(){
    
    /*   构造 root 这棵树   */
    
    
    /*  .............   */
     
    
    /*    是否空间             */
    
    destroy(root);
    
     
    system("pause");   
    return 0;
}

breakfisher 2012-12-03
  • 打赏
  • 举报
回复
list<node> child; //若干个子节点 是要递归释放的
whiteyundd 2012-12-03
  • 打赏
  • 举报
回复
删除节点,只能递归调用。 ~node()是析构函数,删除节点的时候会自动调用的。 可以把新申请的节点,加入到一个链表,就是个编号,释放的时候,遍历下那个链表,就可以全部释放掉了, 和之前的逻辑比,释放容易。
图灵狗 2012-12-03
  • 打赏
  • 举报
回复
list<node> child也要释放才行。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧