需要析构函数来释放内存空间,即使所有项目都已弹出
need destructor to deallocate memory space even if all the items have been popped
即使所有元素都已弹出,我是否需要为类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;
}
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 需要析构函数来释放内存空间,即使所有项目都已弹出
- 是否有任何标准的Visual Studio 2008插件可用于跟踪/记录C++项目的构造函数和析构函数调用