C++ 在c+;中删除动态分配的链接堆栈中的临时变量时出现的问题+;

C++ 在c+;中删除动态分配的链接堆栈中的临时变量时出现的问题+;,c++,stack,C++,Stack,我刚刚了解了链接堆栈,并正在编写一个链接堆栈,方法是使用节点结构和一个类“菜单”,该类包含所有功能,如推送、弹出或显示。只要需要,我就在这些函数中使用动态分配的“tmp”节点(不声明为类变量)。完成函数编码后,我“删除”-d“tmp”并退出。但这会导致堆栈中出现垃圾值,尽管我确信这些操作在其他方面工作正常 当我将“tmp”的动态alloc更改为静态alloc时,我的代码运行良好,确保代码的其他方面是正确的。我甚至尝试清除push()和disp()中的“deletetettmp;”语句,有趣的是,

我刚刚了解了链接堆栈,并正在编写一个链接堆栈,方法是使用节点结构和一个类“菜单”,该类包含所有功能,如推送、弹出或显示。只要需要,我就在这些函数中使用动态分配的“tmp”节点(不声明为类变量)。完成函数编码后,我“删除”-d“tmp”并退出。但这会导致堆栈中出现垃圾值,尽管我确信这些操作在其他方面工作正常

当我将“tmp”的动态alloc更改为静态alloc时,我的代码运行良好,确保代码的其他方面是正确的。我甚至尝试清除push()和disp()中的“deletetettmp;”语句,有趣的是,我的代码工作正常。我在学校的老师告诉我,应该总是“删除”由“新”运营商分配的mem,以避免mem泄漏,但我不明白为什么预防本身会造成问题

struct st //creating the stack nodes

{

 int n;

st *nxt;

};

class menu //houses push(),pop(),disp()

{

 st *top;

 public:

  menu() 

  {

   top=NULL;

   top->nxt=NULL;

  }

  void push(); //pushes new elements into stack

  void pop(); //pops out elements from top of stack

  void disp(); //displays the entire stack

  ~menu();

};


void menu::disp()

 {

  st *tmp=new st; //dynamically allocated node


  if(top==NULL)

   cout<<"Empty stack";

  else

  {

   cout<<"The new stack is";

   tmp=top;

   while(tmp!=NULL)

    {

     cout<<tmp->n<<" -> ";

     tmp=tmp->nxt;

    }

  }

  delete tmp; // deleting the dynamic mem

 }



void menu::push()

 {

  st *tmp= new st; //dynamically allocated node

  cout<<"Enter the new element";

  cin>>tmp->n;

  tmp->nxt=NULL;

  if(tmp==NULL)

   cout<<"Overflow";

  else if(top==NULL)

   {
    top=tmp;
   }
  else
   {
    tmp->nxt=top;
    top=tmp;

   }
  delete tmp; // deleting the dynamic mem
 }

void menu::pop()
 {
  cout<<"Deleting the top elememt"<<endl;
  if(top==NULL)
   cout<<"Underflow"<<endl;
  else
   {
    cout<<"The deleted element is   "<<top->n<<endl;
    top=top->nxt;
   }
 }

menu::~menu()
 {
  st *tmp= new st;

  while(top!=NULL)
   {
    tmp=top;
    top=top->nxt;
    delete tmp;
   }
 }
struct st//创建堆栈节点
{
int n;
st*nxt;
};
类菜单//包含push()、pop()、disp()
{
圣*托普;
公众:
菜单()
{
top=NULL;
top->nxt=NULL;
}
void push();//将新元素推入堆栈
void pop();//从堆栈顶部弹出元素
void disp();//显示整个堆栈
~menu();
};
void菜单::disp()
{
st*tmp=new st;//动态分配的节点
if(top==NULL)

coutResearch智能指针。在几乎每个函数的开头都有这样一条语句
st*tmp=new st
。当您只需要
tmp
遍历链接列表时,您正在将内存分配给
tmp
。当涉及
new
时,一般的经验法则是。未来的错误:
菜单
违反了。这是真的“tmp”可以成为一个类变量,因此无需对mem的alloc和dealloc大惊小怪。但无论在逻辑上还是语法上,它都不正确。而且我在学校学到了拇指法则,因此我故意删除了“tmp”,实际上我的代码在没有该语句的情况下运行得非常好。但我仍然不清楚它是什么使用垃圾输出?这些注释都不能从计算机的角度提供问题的见解