Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Sepheroth
0 / 0 / 2
Регистрация: 17.10.2013
Сообщений: 66
1

Использование New и Delete

03.06.2015, 10:49. Просмотров 236. Ответов 6
Метки нет (Все метки)

Уважаемые форумчане, помогите поправить программу.
Программа реализует дек с использованием New и Delete. Но не запускается. Программа "падает" на вводе второго строкового массива, а именно тут:
C++
1
*elem->str = new char (**elem->str);
. Пробовал писать по разному, но ни к чему хорошему это ни привело.

Заранее благодарен.

Полный код программы:
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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#include <iostream>
#include <string>
#include <stdlib.h>
#include <Windows.h> 
#include <fstream>
 
using std::cin;
using std::cout;
using std::string;
using std::to_string; 
 
struct Dek
{
    char **str;
    int *data;
    int size_m;
    struct Dek *next, *prev;
};
 
Dek *Head = NULL;
Dek *Tail = NULL;
 
short input();
void show_help();
 
template <typename T>
T input_test(const string &msg);
 
short change_inp(const short &a, const short &b, const string &msg);
 
Dek* input_elem();
void output_elem(Dek *elem);
 
void error_message();
 
void program();
 
void push_front();
void push_back();
void pop_back();
void pop_front();
 
int main(int argc, char argv[])
{   
    setlocale(LC_ALL, "rus");
    program();
 
   return 0;
}
 
void program()
{
    short cmd;
 
    do  { 
          cmd=input(); 
 
          switch (cmd)
          {
              case 1:push_back(); break;
              case 2:pop_back(); break;
              case 3:push_front(); break;
              case 4:pop_front(); break;
              case 6:show_help(); break;
              case 7:{ if (Head != NULL) output_elem(Head); else 
                        { error_message(); cout << "Дек пуст\n"; } break; }
              case 8:{ if (Tail != NULL) output_elem(Tail); else
                        {error_message(); cout << "Дек пуст\n";} break; }
              case 9:{ int i = 0; Dek *tmp = Head;
                          while (tmp != NULL) { i++; tmp = tmp->prev; }
                             cout << "Размер дека : " << i << "\n"; break; }
              case 10:{ Dek *tmp = Head; if (tmp == NULL) { error_message(); cout << "Дек пуст\n"; } else
                  while (tmp != NULL) { output_elem(tmp); tmp = tmp->prev; } break; }
              case 11:{ Dek *tmp = Tail; if (tmp == NULL) { error_message(); cout << "Дек пуст\n"; } else
                  while (tmp != NULL) { output_elem(tmp); tmp = tmp->next; } break; }
              case 12:{ Dek *tmp = Tail; if (tmp == NULL) { error_message(); cout << "Дек пуст\n"; } else
                        { while (tmp != NULL) { tmp = tmp->next; delete tmp; } cout << "Дек очищен\n";
                          Head = NULL; Tail = NULL;}    break; }
             default:
                  break;
          }
        } while (cmd != 5);
}
 
void error_message()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    cout << "Error: ";
}
 
void show_help()
{
    char a[100];
        std::ifstream fin("help.txt");
    if (!fin.is_open()) cout << "Ненайден файл справки";
        while (!fin.eof()) {
            fin.getline(a, 100);
                cout << a << "\n";
    }
}
 
Dek* input_elem()
{
    Dek *elem = new Dek; /* (Dek*)calloc(1, sizeof(Dek));*/
        const int size = change_inp(1, 1000, "Введите размер массивов от 1 до 1000: ");
 
    elem->size_m = size;
 
    elem->data = new int; /* (int*)calloc(size, sizeof(int));*/
        cout << "\nВведите элементы массивов\n*******************************\n";
    for (int i = 0; i < size; i++)
        elem->data[i] = input_test<int>("Введите [" + to_string(i + 1) + "] элемент массива<int>: ");
 
    cout << "\n";
 
    //char **str;
    //int *data;
    //int size_m;
    //struct Dek *next, *prev;
 
 
    *elem->str = new char (**elem->str);  /*(char**)calloc(size, sizeof(*elem->str));*/
    for (int i = 0; i < size; i++)  
    {
        elem->str[i] = new char[*elem->str[i]]; /*(char*)calloc(256, sizeof(*elem->str[i]));*/
         cout << "Введите [" + to_string(i + 1) + "] элемент массива<string>: ";
         cin >> elem->str[i];
         cin.ignore(256, '\n');
         cin.clear();
    }
 
        cout << "\n";
 
    return elem;
}
 
void output_elem(Dek *elem)
{
    cout << "Массив <int> : ";
        for (int i = 0; i < elem->size_m;i++)
        {
            cout << "{" << elem->data[i] << "} ";
        }
 
        cout << "\n";
 
    cout << "Массив <string> : ";
        for (int i = 0; i < elem->size_m; i++)
        {
            cout << "{" << elem->str[i] << "} ";
        }
        
        cout << "\n\n";
}
 
void push_back()
{
    Dek *elem = input_elem();
 
    if (Tail == NULL) {
        elem->next = NULL;
        elem->prev = NULL;
        Head = elem;
        Tail = elem;
    }
    else
    {
        elem->prev = NULL;
        Tail->prev = elem;
        elem->next = Tail;
        Tail = elem;
    }
}
 
void push_front()
{
    Dek *elem = input_elem();
    
    if (Head == NULL) {
        elem->next = NULL;
        elem->prev = NULL;
        Head = elem;
        Tail = elem;
    }
    else
    {
        elem->next = NULL;
        Head->next = elem;
        elem->prev = Head;
        Head = elem;
    }
}
 
void pop_front()
{
    if (Head == NULL) 
    {
        error_message(); cout << "Дек пуст\n"; 
    }
    else
        {
                output_elem(Head);
                Dek *del = Head;
                Head = Head->prev;
                if (Head!=NULL) Head->next = NULL;
                if (Head == NULL) Tail = Head;
                    /*realloc(del->data, 0);*/
                delete del->data;
                for (int i = 0; i < del->size_m; i++)
                    /*  realloc(del->str[i], 0);
                    realloc(del->str, 0);
                    realloc(del,0);*/
                delete del->str[i];
                delete del->str;
                delete del;
                    
        }
}
 
void pop_back()
{
    if (Tail == NULL)
    {
        error_message(); cout << "Дек пуст\n";
    }
    else
    {   
        output_elem(Tail);
        Dek *del = Tail;
        Tail = Tail->next;
        if (Tail!=NULL) Tail->prev = NULL;
        if (Tail == NULL) Head = Tail;
            /*realloc(del->data, 0);*/
        delete del->data;
        for (int i = 0; i < del->size_m; i++)
            /*realloc(del->str[i],0);
            realloc(del->str, 0);
            realloc(del, 0);*/
        delete del->str[i];
        delete del->str;
        delete del;
    }
}
 
short change_inp(const short &a, const short &b, const string &msg)
{    
    short change; bool accept;
    do { 
        change = input_test<int>(msg);
        accept = change < a || change > b;
        if (accept)
        {
            error_message();
             cout << "значение не входит в множество предложеное вам\n";
        }
       } while (accept);
    return change;
}
 
short input()
{
    string input_data; bool accept = false; const int size_m = 12; short num_cmd;
    const string comand_input[size_m] = {"push_back","pop_back", "push_front","pop_front",
                                            "exit", "help","show_head","show_tail","show_size","show_dek_h", "show_dek_t","clear" };
    do {
        cin.clear();
        cout << "Введите команду, для помощи используйте команду 'help'\n> ";
        getline(cin, input_data);
        input_data += '\n';
        for (short i = 0; i < size_m; i++)
        {
            const int k = input_data.find(comand_input[i]);
             if (k != string::npos)
                  accept = (input_data[k + comand_input[i].size()] == 13 || 32);
             if (accept){
                 num_cmd = i + 1; break;
             }
        }
          cin.clear();
          if (!accept) {
              error_message(); cout << "неизвестная команда или пустой ввод\n\n";
          }
    } while (!accept);
    return num_cmd;
}
 
template <typename T>
T input_test(const string &msg)
{
    T size_m;
    bool accept;
    string end_of_input = "\t\r\n ";
    do {
        cout << msg;
        cin >> size_m;
        accept = end_of_input.find(cin.peek()) != string::npos;
        if (!accept) {
            error_message();
            cout << "Не веверный формат данных\n";
            cin.clear();
        }
        cin.ignore(INT_MAX, '\n');
    } while (!accept);
 
    return size_m;
}
0
Вложения
Тип файла: txt help.txt (393 байт, 0 просмотров)
Тип файла: txt Исходный кодcpp.txt (6.6 Кб, 0 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2015, 10:49
Ответы с готовыми решениями:

Использование realloc наряду с new и delete
Можно ли использовать realloc наряду с new и delete? Ведь new использует malloc, а delete...

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если...

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete...

Чем отличается delete[] от delete?
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T*...

6
rikimaru2013
03.06.2015, 10:53
  #2

Не по теме:

за что люблю stackoverflow - так такие темы замораживает по причине - "укажите минимальный код описывающий вашу проблему". Эххххх

0
castaway
03.06.2015, 11:02
  #3

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
за что люблю stackoverflow - так такие темы замораживает по причине - "укажите минимальный код описывающий вашу проблему". Эххххх
И правильно делают. Нам этого ой как не хватает.

0
Sepheroth
0 / 0 / 2
Регистрация: 17.10.2013
Сообщений: 66
03.06.2015, 11:26  [ТС] 4
В этой функции находиться ошибка.
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
Dek* input_elem()
{
    Dek *elem = new Dek; 
        const int size = change_inp(1, 1000, "Введите размер массивов от 1 до 1000: ");
 
    elem->size_m = size;
 
    elem->data = new int; 
        cout << "\nВведите элементы массивов\n*******************************\n";
    for (int i = 0; i < size; i++)
        elem->data[i] = input_test<int>("Введите [" + to_string(i + 1) + "] элемент массива<int>: ");
 
    cout << "\n";
 
    *elem->str = new char (**elem->str);  
    for (int i = 0; i < size; i++)  
    {
        elem->str[i] = new char[*elem->str[i]]; 
         cout << "Введите [" + to_string(i + 1) + "] элемент массива<string>: ";
         cin >> elem->str[i];
         cin.ignore(256, '\n');
         cin.clear();
    }
 
        cout << "\n";
 
    return elem;
}
А именно программа вылетает на:
C++
1
*elem->str = new char (**elem->str);
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
03.06.2015, 11:32 5
А что должна делать данная запись?
C++
1
*elem->str = new char (**elem->str);
str в структуре Dek это вообще что?
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
03.06.2015, 11:35 6
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
#include <iostream>
using namespace std;
 
struct Dek
{
    char **str;
    int *data;
    int size_m;
    struct Dek *next, *prev;
};
int main()
{
    Dek *elem = new Dek;
 
    //*elem->str = new char(**elem->str);
    // создали Dek - программа выделила для него память, но значения там мусорные - так
    // как нету конструктора по умолчанию или прямой инициализации до использования
    //
    //
    //*elem->str = new char[10];
    // вот я пытаюсь просто записать в область куда ссылается Dek->str указатель на массив и ошибка
    // потому что в elem->str мусор (он может ссылатся на память, что принадлежит операционой системе
    // или другому процессу. Как в эту память можно записывать свои значения? Никак.
    //
    //
    elem->str = new char*[1];
    // мы присваеваем значение elem->str - теперь он ссылается на массив(с одного элеммента правда) типа char*
    // теперь можно разименновывать указатель
    // *elem->str
    //
    //
    //*elem->str = new char(**elem->str);
    // теперь мы в только выделенную область памяти в первый элеммент массива(не придерайтесь к словам - я знаю что он там 1 )
    // пытаемся записать указатель на память типа char
    // так как для выделения нескольких элемментов надо использовать квадратные скобки, а тут круглые - что-то не то да?)
    // круглые скобки это конструктор с параметром - даже для встроенных типов они есть
    // тоесть запись:
    // elem->str[0] = new char[16]; 
    // логична вроде бы) а вы пытаетесь записать в указатель разименованный указатель, который хранит указатель - звучит бредово, как и получилось
    
 
     elem->str[0] = new char[3];
     elem->str[0][0] = 'w';
     elem->str[0][1] = '\0';
     elem->str[0][2] = 'y';
     cout << elem->str[0];
     // вывод до нултерминированного символа
}
1
Sepheroth
0 / 0 / 2
Регистрация: 17.10.2013
Сообщений: 66
03.06.2015, 19:53  [ТС] 7
Хм... По вашему примеру логику вроде понял, но все же не понял как исправить это в коде программы
0
03.06.2015, 19:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2015, 19:53

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"?
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...

New/Delete
нужно рассмотреть конкретную ситуацию: область, выделенная желтым цветом будет очищена, при...


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

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

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