Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 即使所有项都已弹出,也需要析构函数释放内存空间_C++_Stack - Fatal编程技术网

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

C++ 即使所有项都已弹出,也需要析构函数释放内存空间,c++,stack,C++,Stack,即使所有元素都已弹出,我是否需要为类lstack创建析构函数? 请帮我做这个 ~lstack() { if(top==NULL) return; node *tmp; while(top!=NULL) { tmp=top; top=

即使所有元素都已弹出,我是否需要为类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;
    }
~lstack()
{
if(top==NULL)
返回;
节点*tmp;
while(top!=NULL)
{
tmp=顶部;
顶部=顶部->链接;
删除tmp;
}
}    
int main()
{
lstack s;
s、 推(11);
s、 推(101);
s、 推(99);
s、 推(78);

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

对于分配任何资源的类,您总是需要一个析构函数:如果出现问题并引发异常,则可能会泄漏内存。此外,要求在安全销毁对象之前删除对象的内容也是一个笨拙的接口

<>最后,不是标准的C++库有一个堆栈类模板:<代码> STD::Stuts

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

lstack::~lstack()
{
    while(top!=NULL)
    {
        std::unique_ptr<node> tmp(top);
        top=top->link;
    }
}    
lstack::~lstack()
{
while(top!=NULL)
{
标准::唯一的ptr tmp(顶部);
顶部=顶部->链接;
}
}    

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

对于分配任何资源的类,您总是需要一个析构函数:如果出现问题并引发异常,则可能会泄漏内存。此外,要求在安全销毁对象之前删除对象的内容也是一个笨拙的接口

<>最后,不是标准的C++库有一个堆栈类模板:<代码> STD::Stuts

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

lstack::~lstack()
{
    while(top!=NULL)
    {
        std::unique_ptr<node> tmp(top);
        top=top->link;
    }
}    
lstack::~lstack()
{
while(top!=NULL)
{
标准::唯一的ptr tmp(顶部);
顶部=顶部->链接;
}
}    

如果您正在编写该类,并且该类管理诸如空闲存储上的内存之类的资源,那么您应该包含析构函数。这样,您的类的用户——无论是其他程序员还是将来的您自己——就不必记着弹出堆栈的所有元素,作为无内存泄漏代码的先决条件。您可以使用“dele”“te”表示你需要析构函数

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

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


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

如果您正在编写该类,并且该类管理诸如空闲存储上的内存之类的资源,那么您应该包含析构函数。这样,您的类的用户——无论是其他程序员还是将来的您自己——就不必记着弹出堆栈的所有元素,作为无内存泄漏代码的先决条件。您可以使用“delete”“这意味着你需要销毁程序

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

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


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

如果它们没有全部弹出怎么办?如果它们没有弹出,我们当然需要。但是我想确定的是,虽然所有项目都已弹出,但这是强制性的还是非强制性的。什么是
lstack
?你说的是什么depends@RaviKasaudhan提供一些关于lstack实现的详细信息。它是一个链表吗?节点是什么包含?仅整数?当你弹出时,你只返回一个整数?如果是的话,节点只是实现的一部分,在弹出期间释放它是你的工作。如果它们没有全部弹出呢?当然,如果它们没有弹出,我们需要。但是我想确定它是否是强制性的,尽管所有的项目都弹出了。什么是<代码>lstack
?您所说的depends@RaviKasaudhan提供有关lstack实现的一些详细信息。它是一个链表吗?节点包含什么?仅包含int?当弹出时,只返回int?如果是,则节点只是实现的一部分,在弹出期间解除分配它是您的工作。@OliCharlesworth:对象可以是显然,如果您不能销毁它们,它们将泄漏,但语言无法阻止这种情况发生。另一方面,如果您试图在堆栈上创建一个没有可访问析构函数的对象,编译器将拒绝您创建对象,因为该对象已销毁当达到该块的结尾时,是的,我想是这样。但是,不在堆栈上就不足以满足不需要析构函数(三重否定的道歉)了。请考虑<代码> Stutt Foo{Poo::FoE();}结构条{FoXX;~ Bar(){}}@OliCharlesworth:是的……但是如果你不为
Bar
定义析构函数,你仍然可以分配一个
Bar
对象。我不建议这样做,因为内存泄漏不是一个好主意。@OliCharlesworth:对象可以在堆上构造而不被破坏。显然,如果你不能破坏