С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
asdred
0 / 0 / 0
Регистрация: 19.05.2014
Сообщений: 2
#1

Ошибка с динамической памятью - C++

19.05.2014, 09:01. Просмотров 278. Ответов 3
Метки нет (Все метки)

Очень прошу помочь исправить ошибку в области дин.памяти.

Проблема: 1. Шаг Создаю массив для записи 2. Шаг удаляю элемент под номером k, и тут вылетает крит.

Примечание: Если запускать с отладчиком (F5) крит не вылетает, и программа работает.

Код:

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
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "ShellAPI.h"
 
using namespace std;
 
fstream f;
 
struct driver
{
    char *name;
    char *autonum;
    char *technum;
};
 
void infile(driver *mas, int n)
{
    f.open("f.dat",ios::out);
    for(int i = 0; i < n; i++)
    {
        f << mas[i].name; f << "\n";
        f << mas[i].autonum; f << "\n";
        f << mas[i].technum; f << "\n";
    }
    f.close();
}
 
void outfile(driver *mas, int n, driver &p)
{
    f.open("f.dat", ios::in);
    do
    {
        p.name = new char[20];
        f >> p.name;
        p.autonum = new char[20];
        f >> p.autonum;
        p.technum = new char[20];
        f >> p.technum;
        if (f.eof()) break;     
        cout << p.name << endl;
        cout << p.autonum << endl;
        cout << p.technum << endl;
    }
    while (!f.eof());
    f.close();
}
 
void createmas(driver *&mas, int &n)
{
    cout << "Кол-во элементов: ";
    cin >> n;
    mas = new driver[n];
    for(int i = 0; i < n; i++)
    {
        mas[i].name = new char[20];
        cout << "Введите имя: ";
        cin >> mas[i].name;
        mas[i].autonum = new char[20];
        cout << "Введите авто: ";
        cin >> mas[i].autonum;
        mas[i].technum = new char[20];
        cout << "Введите техпаспорт: ";
        cin >> mas[i].technum;
    }
    infile(mas,n);
}
 
void delelmas(driver *&mas, driver *&tempmas, int &k, int &n)
{
    cout << "Номер удаляемого элемента: ";
    cin >> k;
    tempmas = new driver [n-1];
    for ( int i = 0; i < k-1; i++ )
    {
        tempmas[i] = mas[i];
    }
    for ( int i = k-1; i < n; i++ )
    {
        tempmas[i] = mas[i+1];
    }
    delete [] mas;
    mas = tempmas;
    n = n - 1;
    infile(mas,n);
}
 
void addinmas(driver *&mas, driver *&tempmas, driver *&tempmas2, int &n, int &N, int &K)
{
    
    cout << "Сколько элементов добавить: ";
    cin >> N;
    cout << "Под каким номером: ";
    cin >> K;
    K--;
    tempmas = new driver[N];
    tempmas2 = new driver[N + n];
    for (int i = 0; i < N; i++)
    {
        tempmas[i].name = new char[20];
        cout << "Введите имя: ";
        cin >> tempmas[i].name;
        tempmas[i].autonum = new char[20];
        cout << "Введите авто: ";
        cin >> tempmas[i].autonum;
        tempmas[i].technum = new char[20];
        cout << "Введите техпаспорт: ";
        cin >> tempmas[i].technum;
    }
    for (int i = 0; i < K; i++)
    {
        tempmas2[i] = mas[i];
    }
    for (int i = K, j = 0; i < N + K; i++, j++)
    {
        tempmas2[i] = tempmas[j];
    }
    for (int i = N + K; i < N + n; i++, K++)
    {
        tempmas2[i] = mas[K];
    }
    delete [] mas;
    mas = tempmas2;
    n = N + n;
    infile(mas,n);
}
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int sw, n, k, N, K;
    driver *mas, *tempmas, *tempmas2, p;
    bool a = false;
    do
    {
        cout << "1. Создать файл и(или) записать структурированные данные" << endl;
        cout << "2. Удалить из файла элемент с заданным номером" << endl;
        cout << "3. Добавить в файл N элементов с номером К" << endl;
        cout << "4. Печать из файла" << endl;
        cout << "5. Удалить файл" << endl;
        cout << "6. Открыть файл" << endl;
        cout << "0. Выход" << endl;
        cout << "Выбор: ";
        cin >> sw;
        switch(sw)
        {
            case 1:
                createmas(mas,n);
                a = true;
                system("pause");
                system ("cls");
                break;
            case 2:
                if (a == true)
                delelmas(mas,tempmas,k,n);
                else cout << "Перед удалением элемента необходимо чтобы файл был создан программно." << endl;
                system("pause");
                system ("cls");
                break;
            case 3:
                if (a == true)
                addinmas(mas,tempmas,tempmas2,n,N,K);
                else cout << "Перед добавлением элементов необходимо чтобы файл был создан программно." << endl;
                system("pause");
                system ("cls");
                break;
            case 4:
                if (a == true)
                outfile(mas,n,p);
                else cout << "Файл не был создан программно (Не исключено, что файл с таким именем уже существует)." << endl;
                system("pause");
                system ("cls");
                break;
            case 5:
                std::remove("f.dat");
                a = false;
                cout << "Файл удалён" << endl;
                system("pause");
                system ("cls");
                break;
            case 6:
                if (a == true)
                ShellExecute(NULL, TEXT("open"), TEXT("f.dat"), NULL, NULL,SW_RESTORE);
                else cout << "Файл не был создан программно (Не исключено, что файл с таким именем уже существует)." << endl;
                system("pause");
                system ("cls");
                break;
        }
    }
    while (sw != 0);
}
Очень прошу в помощи, т.к. сам не могу понять в чём именно ошибка и мучаюсь уже 2 недели. Заранее благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2014, 09:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка с динамической памятью (C++):

Работа с динамической памятью через указатели. Загадочная ошибка. - C++
Программа запускается и нормально исполняется, но в конце появляется ошибка. Мог бы кто подсказать в чем проблема? Пишу в Microsoft...

Работа с динамической памятью через указатели. Загадочная ошибка. - C++
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Есть такая задача: Создать массив из N целых чисел, N вводит...

После выполнения программы, работающей с динамической памятью, вылетает ошибка - C++
при компиляции вылетает ошибка (не может обратиться к private gолям next, val) err: C2248 если поля поместить в public, то прога...

Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод - C++
Было дано вот такое задание: В этой задаче вам необходимо написать функцию getline, которая читает строку из стандартного потока ввода...

программа с динамической памятью - C++
текст программы #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iomanip&gt; #define m 12 using namespace...

Работа с динамической памятью - C++
Привет всем. Я недавно начал изучать C++ и наткнулся на ошибку:&quot;двумерный динам.exe вызвал срабатывание точки останова&quot; при очистке...

3
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.05.2014, 09:09 #2
А вы динамически выделяли память для массива mas что бы освобождать для него память?
C++
1
    delete [] mas;
Да и вообще я посмотрю с операторами new и delete вы совсем не дружите.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
19.05.2014, 09:18 #3
Во-первых,
C++
1
2
3
4
    for ( int i = k-1; i < n; i++ )
    {
        tempmas[i] = mas[i+1];
    }
при i = n-1 получим выход за пределы в mas [i +1]

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
А вы динамически выделяли память для массива mas что бы освобождать для него память?
C++
1
mas = new driver[n];
0
asdred
0 / 0 / 0
Регистрация: 19.05.2014
Сообщений: 2
19.05.2014, 21:47  [ТС] #4
Спасибо вам большое
0
19.05.2014, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 21:47
Привет! Вот еще темы с ответами:

Работа с динамической памятью! - C++
Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю динамическую память. Определить время выделения и освобождения, и объем...

Операции с динамической памятью - C++
Есть new и delete. Можно написать так: int *a; a = new int ; Дальше, хотим удалить - пишем delete a; Вопрос такой: а если...

Работа с динамической памятью в цикле - C++
Всем привет. Есть переменная data, созданная динамически На каждой итерации цикла в нее записывается информация char* data =...

Объяснить код работы с динамической памятью - C++
Объясните пожалуйста этот кусок кода : class test { public: int *p = new int(); }; int main() { test *b =...


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

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

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