Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
1

Утечка памяти при удалении

15.10.2014, 20:00. Просмотров 947. Ответов 9
Метки нет (Все метки)

Здравствуйте!

Возникла проблема при удалении последнего элемента из двусвязного списка.
Вот код, где я добавляю элемент в конец списка:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void dlist::add(string _data, string x)
{
    info *temp;
    infoD *tempD;
    if (!head)
    {
        temp = new info(_data);
        tempD = new infoD(x);
        tail = head = temp;
        tailD = headD = tempD;
    }
    else
    {
        temp = new info(_data);
        tempD = new infoD(x);
        tail->next = temp;
        temp->prev = tail;
        tail = temp;
        tailD->next = tempD;
        tempD->prev = tailD;
        tailD = tempD;
    }
}


Удаление:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void dlist::delete_tail()
{
    info *temp;
    infoD *tempD;
    if(head&&head != tail)
    {
        temp = tail;
        tail = temp->prev; 
        delete temp;
        tempD = tailD;
        tailD = tempD->prev;
        delete tempD;
    }
    if(head&&head == tail)
    {
        delete_head();
    }
}


Скорее всего я напортачил с указателем на предыдущий элемент, но ошибки не вижу. Хотя в отладчике все нормально было ><

Заранее спасибо за помощь!

Добавлено через 19 минут
Вызывается удаление после нажатия кнопки в граф.интерфейсе. Может быть это как-то поможет

Добавлено через 2 минуты
Вот еще классы:
info:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class info
{
private:
    string data; // поле информации
    info *prev, *next; // указатель на следующий\предыдущий элемент
public:
    info(); // конструктор по умолчанию
    info(string _data); //  конструктор инициализации
    ~info() { } // деструктор
    virtual string get_data(); // модификатор
    virtual void set_data(string _data); // селектор
    friend class dlist; // дружественный класс
    friend void show(dlist &x); // дружественная функция вывода
    friend class Dialog;
};


infoD:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class infoD : public info
{
private:
    string name; // номер сообщения
    infoD *prev, *next; // указатель на следующий\предыдущий элемент
public:
    infoD(); // конструктор по умолчанию
    infoD(string x); //  конструктор инициализации
    ~infoD() { } // деструктор
    void set_data(string x); // селектор
    string get_data(); // модификатор
    friend class Dialog;
    friend class dlist;
};


dlist:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class dlist
{
private:
    info *head, *tail;  // указатель на начальный\последний элемент списка класса info
    infoD *headD, *tailD; // указатель на начальный\последний элемент списка класса infoD
public:
    dlist(); // конструктор по умолчанию
    ~dlist(); // деструктор
    void add(string _data, string x); // добавление элемента
    void add_first(string _data, string x); // добавление элемента в начало списка (новый начальный элемент)
    friend void show(dlist &x); // дружественная функция вывода
    dlist(const dlist &x); //  конструктор копирования
    dlist operator=(dlist x); // перегрузка оператора присваивания
    friend class Dialog;
    void delete_head(); // удаление первого элемента
    void delete_tail(); // удаление последнего элемента
    void save(); // запись в файл
    void read(); // чтение из файла
};


Добавлено через 56 минут
Ошибка возникает даже тогда, когда я просто переопределяю указатель tail на предыдущий элемент, без удаления последнего элемента =(

Добавлено через 5 минут
Собственно сама ошибка (забыл главное написать):
C++
1
2
Программа неожиданно завершилась.
D:\...\GUIlist.exe завершился с кодом -1073741819
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2014, 20:00
Ответы с готовыми решениями:

Утечка памяти при использовании хука
Добрый вечер. Есть Directx hook для x86 под DX9 на C++ . После инжекта в...

Вылетает при удалении памяти
У меня тут конфуз: class InversTree { struct element { ...

утечка памяти при сложении разноразмерных матриц
#include &lt;iostream&gt; using namespace std; class Matrix { private: int...

Освобождение памяти при удалении структуры
Есть структура с указателем на блок памяти, если удалить структуру,память...

Будет ли утечка памяти при выполнении данного кода?
собстна, сабж. char* cpy(char* source, int pos, int kolv) { char* dist =...

9
Kuzia domovenok
2413 / 2129 / 514
Регистрация: 25.03.2012
Сообщений: 7,663
Записей в блоге: 1
15.10.2014, 20:58 2
Собственно зачем в одном списке хранить два списка???
Список это один тип данных. Это не переменная.
Ты создаёшь тип данных dlist
C++
1
2
3
4
5
class dlist
{
private:
    info *head, *tail;
}
а затем можешь создать две переменные такого списка.
C++
1
2
dlist info_list;
dlist infoD_list;
0
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
16.10.2014, 10:43  [ТС] 3
Kuzia domovenok, Это по заданию надо было
Создать класс-контейнер (в данном случае список) и в нем хранить что-то (при этом это что-то реализовать через класс)

Добавлено через 2 минуты
+ необходимо было продемонстрировать наследование, виртуальные функции и т.д. , поэтому и создал 2ой класс infoD.
Соответственно надо было сделать так, чтобы данные разных типов могли храниться в 1 классе-контейнере.
Проблема с удалением возникла еще задолго до того, как был создан 2ой класс (infoD). Просто уже кончились варианты решения этой проблемы.

Добавлено через 13 часов 37 минут
Все еще актуально
0
Kuzia domovenok
2413 / 2129 / 514
Регистрация: 25.03.2012
Сообщений: 7,663
Записей в блоге: 1
16.10.2014, 11:18 4
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Это по заданию надо было
Gr1f0nn, ну и ты нифига не понял задание, как я вижу.
класс это описание одного объекта
если нужен ещё один список, создавай второй экземпляр этого же класса. Нет никакой необходимости создавать два класса infoD и info, если они ничем не отличаются.
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
+ необходимо было продемонстрировать наследование, виртуальные функции и т.д. , поэтому и создал 2ой класс infoD.
было так прямо необходимо, что никакого даже намёка на наследование и виртуальн.функции не появилось.
Вот здесь я написал по-быстрому наследование и виртуальные функции
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
class node{
  private:
    node* next;
    node* prev;
  public:
    virtual void print() = 0;
};
class numericNode:public Node{
  private:
    double data;
  public:
    simpleNode(double r):data(r){};
    virtual void print(){
      cout<<data<<" "<<endl;
    }
};
class stringNode:public Node{
  private:
    string data;
  public:
    stringNode(string str):data(str){};
    virtual void print(){
      cout<<data<<" "<<endl;
    }
};
class list{
  private:
    node* head;
    node* tail;
  public:
    list():head(NULL), tail(NULL){};
    void push_back(node* item){
       if (!item) return;
       item->prev=tail;
       if (tail)  tail->next=item;
       tail=item;
       if (!head) head=tail;
    }
    //operator =
    //list(const list& copy);
    void print(){
       for (Node* it=head; it; it=it->next)
            it->print();
    }
    ~list(){
       while(head){
           Node* dead=head;
           head=head->next;
           delete dead;
       }
    }
};
int main()
{
  list units;
  units.push_back(new numericNode(3.14));
  units.push_back(new stringNode("hello"));
  units.push_back(new stringNode("666"));
  units.print();
  return 0;
}
1
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
16.10.2014, 11:34  [ТС] 5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Gr1f0nn, ну и ты нифига не понял задание, как я вижу.
Дело в том, что это уже 3е задание, которое было основано на первом(его приняли именно таким, но без класса infoD) :
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Создать класс-контейнер (в данном случае список) и в нем хранить что-то (при этом это что-то реализовать через класс)
Я ничего не имею против вашего решения и я с ним вполне согласен, но мне сказали делать именно так

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
никакого даже намёка на наследование и виртуальн.функции не появилось.
Как так?Оо Соглашусь с тем, что в моем случае наследование и использование виртуальных функций не совсем оправдано(или даже вообще смысла в этом нет, в данном случае), но сама структура реализации ведь правильная? Или нет?

И все-таки по-поводу удаления последнего элемента. Уже не знаю, что попробовать. Ошибку не вижу ><
0
Kuzia domovenok
2413 / 2129 / 514
Регистрация: 25.03.2012
Сообщений: 7,663
Записей в блоге: 1
16.10.2014, 12:07 6
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
И все-таки по-поводу удаления последнего элемента. Уже не знаю, что попробовать. Ошибку не вижу ><
так выложи код целиком, который можно вставить, запустить и получить ошибку! Я не собираюсь твои обрывки кода соединять вместе и дописывать, чтобы проверить, что у тебя падает.
Ты что, боишься потратить лишнее место на форуме, что выкладываешь маленькие кусочки?
0
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
16.10.2014, 12:22  [ТС] 7
Kuzia domovenok, Я думал, что ошибка где-то в 1 функции, вот и выложил только ее

dialog.h
Кликните здесь для просмотра всего текста
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
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include "list.h"
#include "info.h"
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
    
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private slots:
    void on_Add_clicked();
 
    void on_Addfirst_clicked();
 
    void on_Show_clicked();
 
    void on_Delete_clicked();
 
    void on_Delete_head_clicked();
 
    void on_Delete_t_clicked();
 
    void on_Save_clicked();
 
    void on_Read_clicked();
 
 
private:
    Ui::Dialog *ui;
};
 
#endif // DIALOG_H


info.h
Кликните здесь для просмотра всего текста
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
#ifndef INFO_H
#define INFO_H
#include <iostream>
#include <cstring>
#include "list.h"
using namespace std;
 
 
class dlist; // предварительное объявление класса
class info
{
private:
    string data; // поле информации
    info *prev, *next; // указатель на следующий\предыдущий элемент
public:
    info(); // конструктор по умолчанию
    info(string _data); //  конструктор инициализации
    ~info() { } // деструктор
    virtual string get_data(); // модификатор
    virtual void set_data(string _data); // селектор
    friend class dlist; // дружественный класс
    friend void show(dlist &x); // дружественная функция вывода
    friend class Dialog;
};
 
class infoD : public info
{
private:
    string name; // номер сообщения
    infoD *prev, *next; // указатель на следующий\предыдущий элемент
public:
    infoD(); // конструктор по умолчанию
    infoD(string x); //  конструктор инициализации
    ~infoD() { } // деструктор
    virtual void set_data(string x); // селектор
    virtual string get_data(); // модификатор
    friend class Dialog;
    friend class dlist;
};
 
#endif // INFO_H


list.h
Кликните здесь для просмотра всего текста
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
#ifndef LIST_H
#define LIST_H
#include <iostream>
#include <cstring>
#include "info.h"
using namespace std;
 
class info; // предварительное объявление класса
class infoD; // предварительное объявление класса
class dlist
{
private:
    info *head, *tail;  // указатель на начальный\последний элемент списка класса info
    infoD *headD, *tailD; // указатель на начальный\последний элемент списка класса infoD
public:
    dlist(); // конструктор по умолчанию
    ~dlist(); // деструктор
    void add(string _data, string x); // добавление элемента
    void add_first(string _data, string x); // добавление элемента в начало списка (новый начальный элемент)
    friend void show(dlist &x); // дружественная функция вывода
    dlist(const dlist &x); //  конструктор копирования
    dlist operator=(dlist x); // перегрузка оператора присваивания
    friend class Dialog;
    void delete_head(); // удаление первого элемента
    void delete_tail(); // удаление последнего элемента
    void save(); // запись в файл
    void read(); // чтение из файла
};
#endif // LIST_H


dialog.cpp
Кликните здесь для просмотра всего текста
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "dialog.h"
#include "ui_dialog.h"
#include "list.h"
#include <cstring>
#include <windows.h>
 
static dlist ob;
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
void Dialog::on_Add_clicked()
{
    string data;
    string name1;
    QString text = ui->NameIn->text();
    QString text1 = ui->Adress->text();
    if((text != "")&&(text1 != ""))
    {
        data = text.toStdString();
        name1 = text1.toStdString();
        ob.add(data, name1);
    }
    ui->Adress->setText("");
    ui->NameIn->setText("");
}
 
void Dialog::on_Addfirst_clicked()
{
    string data;
    string name1;
    QString text = ui->NameIn->text();
    QString text1 = ui->Adress->text();
    if((text != "")&&(text1 != ""))
    {
        data = text.toStdString();
        name1 = text1.toStdString();
        ob.add_first(data, name1);
    }
    ui->Adress->setText("");
    ui->NameIn->setText("");
}
 
void Dialog::on_Show_clicked()
{
    info *temp;
    infoD *tempD;
    string data;
    if (!(ob.head))
       ui->Console->setText("List's empty");
    else
    {
        temp = ob.head;
        tempD = ob.headD;
        do
        {
            data +=" Message: ";
            data += temp->get_data();
            data += " Name: ";
            data += tempD->get_data();
            data +="\n";
            ui->Console->setText(QString::fromStdString(data));
 
        }
        while(temp = temp->next);
    }
}
 
void Dialog::on_Delete_clicked()
{
    info *temp;
    while (ob.head != NULL)
    {
        temp = ob.head;
        ob.head = temp->next;
        delete temp;
    }
}
 
void Dialog::on_Delete_head_clicked()
{
    ob.delete_head();
}
 
void Dialog::on_Delete_t_clicked()
{
    ob.delete_tail();
}
 
void Dialog::on_Save_clicked()
{
    ob.save();
}
 
void Dialog::on_Read_clicked()
{
    ob.read();
}


info.cpp
Кликните здесь для просмотра всего текста
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
#include "info.h"
 
info::info(string _data)
{
    prev = NULL;
    next = NULL;
    set_data(_data);
}
 
string info::get_data()
{
    return data;
}
 
void info::set_data(string _data)
{
    data = _data;
}
 
info::info()
{
    data = "";
    next = NULL;
    prev = NULL;
}
 
infoD::infoD(string x)
{
    prev = NULL;
    next = NULL;
    set_data(x);
}
 
infoD::infoD()
{
    prev = NULL;
    next = NULL;
    set_data(0);
}
 
void infoD::set_data(string x)
{
    name = x;
}
 
string infoD::get_data()
{
    return name;
}
0
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
16.10.2014, 12:22  [ТС] 8
list.cpp
Кликните здесь для просмотра всего текста
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#include "list.h"
#include "info.h"
#include <iostream>
#include <fstream>
 
dlist dlist::operator=(dlist x)
{
    info *temp, *curr;
    curr = x.head;
    do
    {
        if (!head)
        {
            temp = new info(curr->data);
            tail = head = temp;
        }
        else
        {
            temp = new info(curr->data);
            tail->next = temp;
            temp->prev = tail;
            tail = temp;
        }
    }
    while(curr = curr->next);
    return *this;
}
 
dlist::dlist(const dlist &x)
{
    info *temp, *curr;
    curr = x.head;
    head = tail = NULL;
    do
    {
        if (!head)
        {
            temp = new info(curr->data);
            tail = head = temp;
        }
        else
        {
            temp = new info(curr->data);
            tail->next = temp;
            temp->prev = tail;
            tail = temp;
        }
    }
    while(curr = curr->next);
}
 
dlist::dlist()
{
    head = NULL;
    tail = NULL;
    headD = NULL;
    tailD = NULL;
}
 
void dlist::add(string _data, string x)
{
    info *temp;
    infoD *tempD;
    if (!head)
    {
        temp = new info(_data);
        tempD = new infoD(x);
        tail = head = temp;
        tailD = headD = tempD;
    }
    else
    {
        temp = new info(_data);
        tempD = new infoD(x);
        tail->next = temp;
        temp->prev = tail;
        tail = temp;
        tailD->next = tempD;
        tempD->prev = tailD;
        tailD = tempD;
    }
}
 
void dlist::add_first(string data, string x)
{
    info *temp;
    infoD *tempD;
 
    if (!head&&!headD)
    {
        temp = new info(data);
        tempD = new infoD(x);
        tail = head = temp;
        tailD = headD = tempD;
    }
    else
    {
        temp = new info(data);
        tempD = new infoD(x);
        temp->next = head;
        head = temp;
        tempD->next = headD;
        headD = tempD;
    }
}
 
dlist::~dlist()
{
    info *temp;
    infoD *tempD;
    while (head != NULL && headD != NULL)
    {
        temp = head;
        head = temp->next;
        delete temp;
        tempD = headD;
        headD = tempD->next;
        delete tempD;
    }
}
 
void show(dlist &x)
{
    info *temp;
    if (!(x.head))
        cout << "List's empty";
    else
    {
        temp = x.head;
        do
        {
            cout << "Message: " << temp->get_data() << '\n';
 
        }
        while(temp = temp->next);
    }
}
 
void dlist::delete_head()
{
    info *temp;
    infoD *tempD;
    if(head&&headD)
    {
        temp = head;
        head = head->next;
        delete temp;
        tempD = headD;
        headD = headD->next;
        delete tempD;
    }
}
 
void dlist::delete_tail()
{
    info *temp;
    infoD *tempD;
    if(head&&head != tail)
    {
        temp = tail;
        tail = temp->prev;
        delete temp;
        tempD = tailD;
        tailD = tempD->prev;
        delete tempD;
    }
    if(head&&head == tail)
    {
        delete_head();
    }
}
 
void dlist::save()
{
    info *temp;
    infoD *tempD;
    ofstream fout("fout");
    temp = head;
    tempD = headD;
    do
    {
        fout << temp->get_data() << "\n";
        fout << tempD->get_data() << "\n";
    }
    while (temp = temp->next);
    fout.close();
 
}
 
void dlist::read()
{
    info *temp;
    infoD *tempD;
    string buf;
    string x;
    ifstream fin("fin");
    do
    {
        if (!head&&!headD)
        {
            fin >> buf;
            fin >> x;
            temp = new info(buf);
            tail = head = temp;
            tempD = new infoD(x);
            tailD = headD = tempD;
        }
        else
        {
            fin >> buf;
            fin >> x;
            temp = new info(buf);
            tail->next = temp;
            temp->prev = tail;
            tail = temp;
            tempD = new infoD(x);
            tailD->next = tempD;
            tempD->prev = tailD;
            tailD = tempD;
        }
    }
    while(!fin.eof());
    fin.close();
}


main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QtGui/QApplication>
#include "dialog.h"
#include "list.h"
#include "info.h"
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    
    return a.exec();
}


И если надо, то вот ui
Кликните здесь для просмотра всего текста
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>712</width>
    <height>449</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>700</width>
    <height>435</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>681</width>
     <height>421</height>
    </rect>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout_2">
    <item>
     <layout class="QGridLayout" name="gridLayout_4">
      <item row="0" column="0" colspan="2">
       <layout class="QHBoxLayout" name="horizontalLayout">
        <item>
         <widget class="QLabel" name="name">
          <property name="text">
           <string>Сообщение:</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QLineEdit" name="NameIn"/>
        </item>
        <item>
         <widget class="QLabel" name="Adresslabel">
          <property name="text">
           <string>Адресат:</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QLineEdit" name="Adress"/>
        </item>
       </layout>
      </item>
      <item row="1" column="0" colspan="2">
       <layout class="QGridLayout" name="gridLayout_2">
        <item row="0" column="0">
         <widget class="QPushButton" name="Add">
          <property name="text">
           <string>Добавить в список</string>
          </property>
         </widget>
        </item>
        <item row="0" column="2">
         <widget class="QPushButton" name="Addfirst">
          <property name="text">
           <string>Добавить в начало</string>
          </property>
         </widget>
        </item>
        <item row="0" column="3">
         <widget class="QPushButton" name="Delete">
          <property name="text">
           <string>Очистить список</string>
          </property>
         </widget>
        </item>
        <item row="0" column="4">
         <widget class="QPushButton" name="Show">
          <property name="text">
           <string>Показать список</string>
          </property>
         </widget>
        </item>
       </layout>
      </item>
      <item row="2" column="0">
       <layout class="QGridLayout" name="gridLayout_3">
        <item row="0" column="0">
         <widget class="QTextEdit" name="Console"/>
        </item>
        <item row="0" column="1">
         <layout class="QVBoxLayout" name="verticalLayout_2">
          <item>
           <widget class="QPushButton" name="Delete_head">
            <property name="text">
             <string>Удалить первый элемент</string>
            </property>
           </widget>
          </item>
          <item>
           <widget class="QPushButton" name="Delete_t">
            <property name="text">
             <string>Удалить последний элемент</string>
            </property>
           </widget>
          </item>
          <item>
           <widget class="QPushButton" name="Save">
            <property name="text">
             <string>Сохранить в файл</string>
            </property>
           </widget>
          </item>
          <item>
           <widget class="QPushButton" name="Read">
            <property name="text">
             <string>Прочитать из файла</string>
            </property>
           </widget>
          </item>
          <item>
           <widget class="QPushButton" name="Close">
            <property name="text">
             <string>Close</string>
            </property>
           </widget>
          </item>
         </layout>
        </item>
        <item row="1" column="0">
         <spacer name="verticalSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
          </property>
          <property name="sizeType">
           <enum>QSizePolicy::Minimum</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>20</width>
            <height>40</height>
           </size>
          </property>
         </spacer>
        </item>
       </layout>
      </item>
     </layout>
    </item>
    <item>
     <spacer name="horizontalSpacer">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeType">
       <enum>QSizePolicy::Minimum</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>78</width>
        <height>18</height>
       </size>
      </property>
     </spacer>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections>
  <connection>
   <sender>Close</sender>
   <signal>clicked()</signal>
   <receiver>Dialog</receiver>
   <slot>close()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>647</x>
     <y>391</y>
    </hint>
    <hint type="destinationlabel">
     <x>348</x>
     <y>207</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>
0
Kuzia domovenok
2413 / 2129 / 514
Регистрация: 25.03.2012
Сообщений: 7,663
Записей в блоге: 1
16.10.2014, 13:08 9
Лучший ответ Сообщение было отмечено Gr1f0nn как решение

Решение

Во-первых, функция add_first(); портит указатель prev
Если заполнять список этой функцией, у всех элементов prev будет равен NULL, а не указателю на предыдущий элемент

Добавлено через 5 минут
Во-первых, в функции delete_tail() я не вижу присвоения NULL хвосту.
C++
1
2
tailD->next=NULL;
tail->next=NULL;
1
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
16.10.2014, 13:20  [ТС] 10
Kuzia domovenok, Спасибо! Теперь все работает!
0
16.10.2014, 13:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2014, 13:20

Утечка памяти при создании динамической переменной класса
Никак не могу исправить проблему утечки памяти при создании динамической...

Ошибка при удалении динамически выделенной памяти
Добрый день, хочу удалить выделенный массив, но выдает ошибку. Вот собственно...

Ошибка с delete при удалении памяти из-под строки
strngbad.h // strngbad.h -- flawed string class definition #include...


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

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

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