Проблемы при удалении временной переменной в динамически размещенном связанном стеке в c ++ - PullRequest
0 голосов
/ 22 октября 2019

Я только что узнал о связанных стеках и кодировал один, используя структуру для узлов и класс «меню», в котором находятся все функции, такие как 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) приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...