Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
ajaxtpm
4 / 4 / 0
Регистрация: 10.06.2011
Сообщений: 20
1

Ошибка в Классе связного списка

10.06.2011, 19:15. Просмотров 679. Ответов 8
Метки нет (Все метки)

Пишу связный список в виде класса, но вот только что заметил, из за удаления элемента ( при его добавлении выделяю под него память new-шкой, а удаляю соответсвенно delete ) программа экстренно закрывается, пишу под Win Xp в среде Dev-C/C++, метод удаление под названием Del, освобождение памяти закомментировал, в чём может быть дело ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
 
class KList {
      private :
              int Data ;
              KList* Next ;
      public :
             KList ( int _V ) {
                   Data = _V ;
                   Next = NULL ;
                   } ;
             KList ( const KList &_K ) {
                   Data = _K.Data ;
                   Next = _K.Next ;
                   } ;
             ~KList () {
                    KList *T1 , *T2 ;
                    T1 = Next ;
                    while ( T1 != NULL ) {
                          T2 = T1 -> Next ;
                          delete T1 ;
                          T1 = T2 ;
                          } ;
                    } ; 
             void Add ( int _V ) {
                  KList *T ;
                  T = this ;
                  while ( T -> Next != NULL ) {
                        T = T -> Next ;
                        } ;
                  T -> Next = new KList ( _V ) ;
                  } ;
             void Del ( int _N ) {
                  KList *T1 , *T2 ;
                  T1 = this ;
                  int I = _N - 2 ;
                  while ( I > 0 and T1 -> Next != NULL ) {
                        T1 = T1 -> Next ;
                        I-- ;
                        } ;
                  if ( T1 -> Next == NULL ) {
                       return ;
                       } ;
                  T2 = T1 -> Next ;
                  T1 -> Next = T2 -> Next ;
                  // delete T2 ;
                  } ;
             void Print () {
                  KList *T ;                  
                  printf ( " * Coherent List [ " ) ;
                  T = this ;
                  while ( T -> Next != NULL ) {
                        printf ( "%i -> " , T -> Data ) ;
                        T = T -> Next ;
                        } ;
                  printf ( "%i ]\n" , T -> Data ) ;
                  } ;
             void PrintAux () {
                  KList *T ;                  
                  printf ( " * Coherent List [ " ) ;
                  T = this ;
                  while ( T -> Next != NULL ) {
                        printf ( "%p -> " , T  ) ;
                        T = T -> Next ;
                        } ;
                  printf ( "%p ]\n" , T ) ;
                  } ;
 
                    
      } ;
      
int main () {
    int I ;
    KList K ( 0 ) ;
    for ( I = 1 ; I <= 10 ; I++ ) {
        K.Add ( I ) ;
        } ;
    {
        KList T ( 111 ) ;
        } ;
    K.Print () ;
    K.PrintAux () ;
    K.Del ( 5 ) ;
    K.Print () ;
 
    scanf ( "%*c" ) ;
    return 0 ;
} ;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2011, 19:15
Ответы с готовыми решениями:

Ошибка в реализации связного списка
Здравствуйте. Делаю заголовочный файл связного списка. В результате компиляции...

Создание связного списка
нужно создать связной список, что собственно уже сделал. что нужно: ...

Сортировка связного списка
Привет всем! как правильно написать сортировку для связного циклического списка...

Сортировка связного списка
Привет всем! пришлите пожалуйста код реализации сортировки односвязного списка...

Реализация связного списка
Помогите решить задачу Нужно написать программу без использования...

8
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
10.06.2011, 19:36 2
попробуй вставить в деструктор строку
C++
1
printf("destruct");
раскомментируй строчку с delete и запусти.
у меня вызывается триллион деструкторов и потом вылетает с ошибкой. сдается мне, проблема в деструкторе.
0
ajaxtpm
4 / 4 / 0
Регистрация: 10.06.2011
Сообщений: 20
10.06.2011, 19:43  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
             ~KList () {
                    KList *T1 , *T2 ;
                    T1 = Next ;
                    while ( T1 != NULL ) {
                          T2 = T1 -> Next ;
                          delete T1 ;
                          T1 = T2 ;
                          } ;
                    printf("destruct\n");
                    } ;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main () {
    int I ;
    KList K ( 0 ) ;
    for ( I = 1 ; I <= 10 ; I++ ) {
        K.Add ( I ) ;
        } ;
    K.Print () ;
    K.PrintAux () ;
    K.Del ( 5 ) ;
    K.Print () ;
 
    scanf ( "%*c" ) ;
    return 0 ;
} ;



и такой вывод я получил с терминала перед аварийным закрытием проги




* Coherent List [ 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 ]
* Coherent List [ 0022FF40 -> 003E2468 -> 003E24D0 -> 003E24E0 -> 003E24F0 -> 0
03E2500 -> 003E2510 -> 003E2520 -> 003E2530 -> 003E2540 -> 003E2550 ]
destruct
destruct
destruct
destruct
destruct
destruct
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
10.06.2011, 19:46 4
а вот так =)
C++
1
2
3
4
5
6
7
8
9
10
11
            ~KList() {
                static int a=0;
                printf("destruct %d \n", ++a); //отслеживаем каждый вызов деструктора
                KList *T1 , *T2 ;
                T1 = Next ;
                while ( T1 != NULL ) {
                    T2 = T1 -> Next ;
                    delete T1 ;
                    T1 = T2 ;
                } ;
            }
0
ajaxtpm
4 / 4 / 0
Регистрация: 10.06.2011
Сообщений: 20
10.06.2011, 19:51  [ТС] 5
Цитата Сообщение от no0ker Посмотреть сообщение
попробуй вставить в деструктор строку
C++
1
printf("destruct");
раскомментируй строчку с delete и запусти.
у меня вызывается триллион деструкторов и потом вылетает с ошибкой. сдается мне, проблема в деструкторе.
ну вот что тогда ?
последовательно беру все Next-ы, пока не будет NULL, возвращая, не менее последовательно, память
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
10.06.2011, 19:55 6
ajaxtpm, ну да, это разумно при уничтожении всего односвязного списка(состоящего из множества объектов класса Klist), а при удалении лишь _одного_ элемента односвязного списка это разве подходит?
0
ajaxtpm
4 / 4 / 0
Регистрация: 10.06.2011
Сообщений: 20
10.06.2011, 20:01  [ТС] 7
так при уничтожении одного элемента методом del я только меняю указатель того, который до удаляемого, на тот, который после удаляемого, а затем освобождаю память самого удаляемого)
меня этот момент беспокоит с освобождением памяти удаляемого, не вызывается ли там деструктор ? и почему ?

да, деструкторов немножко больше, чем нужно чуууть чуть, на 50000-ом я это понял
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
10.06.2011, 21:01 8
сдается мне, нужно почитать вот тут немного теории.
0
ajaxtpm
4 / 4 / 0
Регистрация: 10.06.2011
Сообщений: 20
11.06.2011, 11:54  [ТС] 9
Хм, кажется понял
А понял я то, что при вызове delete-а вне деструктора, вызывается сам деструктор, внутри которого есть уже свой delete, т.е. получается два освобождения памяти, что и приводит к ошибке
я прав ?

Иии надо вместе delete писать Next -> ~KList () ?
0
11.06.2011, 11:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 11:54

Реализация связного списка
надо решить задачу: Сведения о владельце автомобиля: фамилия, марка автомобиля...

Обращение к члену связного списка
Прошу помощи в решении Стоит задача обращения к члену связного списка(того...

Сортировка пузырьком связного списка
Доброго времени суток, надеюсь на вашу помощь в понимании проблемы при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru