即使所有元素都被弹出,我还需要一个类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;
}
答案 0 :(得分:3)
如果您正在编写类,并且类在免费商店中管理内存等资源,则应包含析构函数。这样,你的类的用户 - 无论是其他程序员还是将来你自己 - 都不需要记住弹出堆栈的所有元素作为内存泄漏代码的先决条件。你使用'删除'表明你需要析构函数。
用户肯定不会期望这样的要求。
即使你//试图通过文档强制执行这样的规则,并且尽责的程序员试图遵循它,但异常的可能性(在正常的控制流程之外处理)将意味着有时用户即使他/她想要,也无法清空筹码。
应该编写析构函数,以便它处理空堆栈的情况(如你所见)。
答案 1 :(得分:2)
可以在堆栈上构建的所有类都需要析构函数。如果你没有声明一个,就会生成一个析构函数,它只会破坏对象的所有成员(显然,破坏内置类型什么都不做)。
对于分配任何资源的类,你总是需要一个析构函数:如果出现错误并抛出异常,你就会泄漏内存。此外,它是一个尴尬的界面,要求在安全销毁之前删除对象的内容。
最后,并非标准C ++库具有堆栈类模板:std::stack<T>
。
你发布的析构函数的实现是不必要的复杂!它可以简化:
lstack::~lstack()
{
while(top!=NULL)
{
std::unique_ptr<node> tmp(top);
top=top->link;
}
}