C++ 在c+;中删除动态分配的链接堆栈中的临时变量时出现的问题+;
我刚刚了解了链接堆栈,并正在编写一个链接堆栈,方法是使用节点结构和一个类“菜单”,该类包含所有功能,如推送、弹出或显示。只要需要,我就在这些函数中使用动态分配的“tmp”节点(不声明为类变量)。完成函数编码后,我“删除”-d“tmp”并退出。但这会导致堆栈中出现垃圾值,尽管我确信这些操作在其他方面工作正常 当我将“tmp”的动态alloc更改为静态alloc时,我的代码运行良好,确保代码的其他方面是正确的。我甚至尝试清除push()和disp()中的“deletetettmp;”语句,有趣的是,我的代码工作正常。我在学校的老师告诉我,应该总是“删除”由“新”运营商分配的mem,以避免mem泄漏,但我不明白为什么预防本身会造成问题C++ 在c+;中删除动态分配的链接堆栈中的临时变量时出现的问题+;,c++,stack,C++,Stack,我刚刚了解了链接堆栈,并正在编写一个链接堆栈,方法是使用节点结构和一个类“菜单”,该类包含所有功能,如推送、弹出或显示。只要需要,我就在这些函数中使用动态分配的“tmp”节点(不声明为类变量)。完成函数编码后,我“删除”-d“tmp”并退出。但这会导致堆栈中出现垃圾值,尽管我确信这些操作在其他方面工作正常 当我将“tmp”的动态alloc更改为静态alloc时,我的代码运行良好,确保代码的其他方面是正确的。我甚至尝试清除push()和disp()中的“deletetettmp;”语句,有趣的是,
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”,实际上我的代码在没有该语句的情况下运行得非常好。但我仍然不清楚它是什么使用垃圾输出?这些注释都不能从计算机的角度提供问题的见解