即使所有项目都已弹出,也需要析构函数来释放内存空间

时间:2013-12-30 02:49:30

标签: c++ stack

即使所有元素都被弹出,我还需要一个类lstack的析构函数吗? 请帮帮我。

~lstack()
             {
                if(top==NULL)
                   return;
                node *tmp;
                while(top!=NULL)
                {
                   tmp=top;
                   top=top->link;
                   delete tmp;
                }
             }    
int main()
    {
        lstack s;
        s.push(11);
        s.push(101);
        s.push(99);
        s.push(78);
        cout<<"Item Popped = "<<s.pop()<<endl;
        cout<<"Item Popped = "<<s.pop()<<endl;
        cout<<"Item Popped = "<<s.pop()<<endl;
        cout<<"Item Popped = "<<s.pop()<<endl;
        getch();
        return 0;
    }

2 个答案:

答案 0 :(得分:3)

如果您正在编写类,并且类在免费商店中管理内存等资源,则应包含析构函数。这样,你的类的用户 - 无论是其他程序员还是将来你自己 - 都不需要记住弹出堆栈的所有元素作为内存泄漏代码的先决条件。你使用'删除'表明你需要析构函数。

用户肯定不会期望这样的要求。

即使你//试图通过文档强制执行这样的规则,并且尽责的程序员试图遵循它,但异常的可能性(在正常的控制流程之外处理)将意味着有时用户即使他/她想要,也无法清空筹码。

应该编写析构函数,以便它处理空堆栈的情况(如你所见)。

答案 1 :(得分:2)

可以在堆栈上构建的所有类都需要析构函数。如果你没有声明一个,就会生成一个析构函数,它只会破坏对象的所有成员(显然,破坏内置类型什么都不做)。

对于分配任何资源的类,你总是需要一个析构函数:如果出现错误并抛出异常,你就会泄漏内存。此外,它是一个尴尬的界面,要求在安全销毁之前删除对象的内容。

最后,并非标准C ++库具有堆栈类模板:std::stack<T>

你发布的析构函数的实现是不必要的复杂!它可以简化:

lstack::~lstack()
{
    while(top!=NULL)
    {
        std::unique_ptr<node> tmp(top);
        top=top->link;
    }
}