我在这里正确管理了内存吗?(简单的C++堆栈)

Eri*_*ric 1 c++ memory-management

我是一个动态分配内存的完整菜鸟.这会有内存泄漏或任何其他内存问题吗?

#include <iostream.h>

template <class T> class stack
{
         struct node
         {
                T value;
                node* next;
         };

         public:
                stack()
                {
                       size = 0;
                }

                ~stack()
                {
                       while(size > 0)
                       {
                           node *n = top->next;
                           delete top;
                           top = n;
                           size--;
                       }
                }

                void push(T value)
                {
                     node *n = new node;
                     n->value = value;

                     if(size == 0)
                     {
                          top = n;
                     }
                     else
                     {
                         n->next = top;
                         top = n;
                     }

                     size++;
                }

                T pop()
                {
                       if(size<1)
                       {
                            std::cerr<<"Stack underflow"<<endl;
                            exit(0);
                       }
                       else
                       {
                           node* n = top;
                           int val = n->value;
                           top = n->next;

                           delete n;
                           size--;

                           return val;
                       }
                }

                int getSize()
                {
                    return size;
                }

        private:
                int size;
                node *top;
};
Run Code Online (Sandbox Code Playgroud)

Bil*_*eal 5

我没有看到任何内存管理错误 - 但我确实看到了其他几种错误.例如,什么时候发生T的事情int呢?:)

此外,将堆栈实现为链接列表是浪费的,并且与使用的堆栈dequevector实现相比,执行相对较差std::stack.


Tha*_*tos 5

除了其他优秀的答案,还有一个注意事项:

if(size<1)
{
    std::cerr<<"Stack underflow"<<endl;
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

我建议assert在这里考虑一个或一个例外.exit有点鲁莽,但如果你决定exit,不要退出0:通常表示成功,这是你在错误中想要的最后一件事.