Я только что узнал о связанных стеках и кодировал один, используя структуру для узлов и класс «меню», в котором находятся все функции, такие как push, pop или display. Я использовал динамически размещенный узел 'tmp' (не объявленный как переменная класса) в этих функциях всякий раз, когда это было необходимо. После того, как я закончил кодировать функцию, я «удалил» -d «tmp» и вышел. Но это приводит к значениям мусора в моем стеке, хотя я уверен, что операции в остальном работают нормально.
Когда я изменил динамическое выделение на статическое выделение 'tmp', мой код работал нормально, гарантируячто другие аспекты кода верны. Я даже попытался очистить "удалить tmp;"операторы внутри push () и disp (), а также, что интересно, мой код работал нормально. Мои учителя в школе сказали мне, что всегда нужно «удалять» мем, выделенный оператором «new», чтобы сохранить утечки памяти, но я не совсем понимаю, почему сама профилактика вызывает проблемы.
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;
}
}
Моя логика верна, и это было доказано, когда я использовал статический mem alloc (или удалял «delete tmp;»), поэтому, по моему мнению, он должен работать и с динамическим mem alloc. Но компилятор продолжает подавать значения мусора в мой стек отдельно от тех, которые я ввел.
У меня есть идея, что я сначала выделяю пространство памяти для 'tmp', но затем я переношу его в уже построенныйстек и в конце я удаляю его, когда он становится нулевым. Так что в каком-то смысле я не удаляю мем, который был изначально выделен. Но если это так, то правда ли, что никогда нельзя использовать динамически размещаемый указатель в качестве временной переменной? Потому что тогда никто не сможет удалить mem без предварительного сохранения адреса в другом статическом ptr. Я чувствую, что это очень пагубно, поскольку я не вижу никакого возможного решения проблемы.
Любая помощь по этому вопросу и простое понимание динамических указателей (alloc и dealloc) приветствуются.