Сбой программы после выхода из основной области (динамическое размещение) - PullRequest
0 голосов
/ 17 ноября 2018

Я создавал программу, в которой используются узлы связанных списков со структурой стека, но даже при отсутствии ошибок компилятора он зависает случайным образом. Здесь я попытался упростить мою проблему. Если я хочу только n->s->datas[i]=i;, это не сбой.Программа вылетает после отображения всех номеров и тестирования на консоли. Что я делаю не так?

#include <iostream>

using namespace std;

struct stack {
    int *datas = new int;
    int top = -1;
};

struct node {
    node *next;
    node *prev;
    stack *s = new stack;
};

int main()
{
    node *n = new node;
    node *n1 = new node;
    for (int i = 0; i < 300; i++) {
        n->s->datas[i] = i;
        n1->s->datas[i] = n->s->datas[i];
        cout << n1->s->datas[i] << endl;
    }
    cout << "test";
}

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018
 #include<iostream>

    class stack {
     public:
     stack(int size) {
           datas = new int[size];
           top = -1;
           this->size = size;
     }
     ~stack(){
        if(datas) 
            delete[] datas; //use array delete so you don't leak!!
     }
     int *datas ;
     int top;
     int size;
 };

 class node {
      public:
     node(int size){
          s = new stack(size);
      }
      ~node()
      {
         if(s)
             delete s; 
      }
      node *next;
      node *prev;
      stack *s; 
  };

 using namespace std;
 int main()
 {
     node *n = new node(300);
      node *n1 = new node(300);
      for (int i = 0; i < 300; i++) {
          n->s->datas[i] = i;
          n1->s->datas[i] = n->s->datas[i];
          cout << n1->s->datas[i] << endl;
      }
     cout << "test";
      if(n)
         delete n; //clean up n
       if(n1)
         delete n1; //clean up n1
 }

На практике никто не пишет подобный код специально, потому что он подвержен ошибкам и не имеет каких-либо исключений безопасности. Я надеюсь, что это для класса, а не для ничего производства. В будущем рассмотрим std :: vector для динамических массивов или std :: array для массивов фиксированного размера, и нет ничего плохого в том, чтобы держать несколько переменных в стеке. Нет необходимости, чтобы n или n1 были указателем в вашем случае использования. Наконец, я прошу прощения за форматирование кода, поскольку я не на ПК. Это RAII. Это простой шаблон проектирования, позволяющий избежать утечки данных. Выделите в своих конструкторах, освободите в своих деструкторах. Этот код, однако, далеко не исключение безопасности. Любой из вызовов new может вызвать исключение нехватки памяти.

0 голосов
/ 17 ноября 2018

Вы должны создать специальную функцию для создания узлов для вас. Там выделяют память динамически.

Что-то вроде

static node* create_node(int stack_size)
{
    node* n = new node;
    n->s = new stack;
    n->s->datas = new int[stack_size];
    return n;
}

Ваша основная проблема - неправильное выделение памяти для буфера int * в структуре стека.

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