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

need destructor to deallocate memory space even if all the items have been popped

本文关键字:项目 析构函数 释放 内存 空间      更新时间:2023-10-16

即使所有元素都已弹出,我是否需要为类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;
    }

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

用户当然不会期望这样的要求。

即使你//did//试图通过文档强加这样的规则,并且一个尽职尽责的程序员试图遵循它,异常的可能性(在正常的控制流之外处理)意味着有时用户无法清空堆栈,即使他/她想这样做。

应该编写析构函数,以便它处理空堆栈的情况(就像你的一样)。

所有可以在堆栈上构造的类都需要一个析构函数。如果不声明一个,将生成一个析构函数,它只是销毁对象的所有成员(显然,销毁内置类型不会执行任何操作)。

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

最后,并不是说标准C++库有一个堆栈类模板:std::stack<T> .

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

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