Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232

Удаление динамического массива в классе

26.05.2010, 15:11. Показов 2786. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
при удаление динамического массива в классе зависает программа... хотя в инете нашел кучу примеров, где написано точно также....

зависание в методе void set_name(char n[]), если не удалять будет утечка памяти?
вроде должно удалять и создавать новый... но оно виснет... не знаю что делать
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
#include <iostream>
#include <clocale>
using namespace std;
class student
{
            char *name;
            char *surname;
            char *fname;
            char *adr;
            int phone;
            char *group;
            int stream;
            char *spec;
        public:
            void set_all()
            {
                char *tmp=new char [128];
                int len;
                    cout<<"Введите Имя: ";
                        cin.getline(tmp,127);
                        len=strlen(tmp);
                        name=new char[len];
                        strcpy(name,tmp);
                    cout<<"Введите Фамилию: ";
                        cin.getline(tmp,127);
                        len=strlen(tmp);
                        surname=new char[len];
                        strcpy(surname,tmp);
                    cout<<"Введите Отчество: ";
                        cin.getline(tmp,127);
                        len=strlen(tmp);
                        fname=new char[len];
                        strcpy(fname,tmp);
                    cout<<"Введите Адрес: ";
                        cin.getline(tmp,127);
                        len=strlen(tmp);
                        adr=new char[len];
                        strcpy(adr,tmp);
                    cout<<"Введите Группу: ";
                        cin.getline(tmp,127);
                        len=strlen(tmp);
                        group=new char[len];
                        strcpy(group,tmp);
                    cout<<"Введите Специальность: ";
                        cin.getline(tmp,127);
                        len=strlen(tmp);
                        spec=new char[len];
                        strcpy(spec,tmp);
                    cout<<"Введите Телефон: ";
                        cin>>phone;
                    cout<<"Введите Поток: ";
                        cin>>stream;
                        delete[] tmp;
            }
            void set_name(char n[])
            {
                int len=strlen(n);
                if(name)
                delete name;
                name = new char [len];
                strcpy(name,n);
            }
            void set_surname(char n[])
            {
                int len=strlen(n);
                surname = new char [len];
                strcpy(surname,n);
            }
            void set_fname(char n[])
            {
                int len=strlen(n);
                fname = new char [len];
                strcpy(fname,n);
            }
            void set_adr(char n[])
            {
                int len=strlen(n);
                adr = new char [len];
                strcpy(adr,n);
            }
            void set_group(char n[])
            {
                int len=strlen(n);
                group = new char [len];
                strcpy(group,n);
            }
            void set_spec(char n[])
            {
                int len=strlen(n);
                spec = new char [len];
                strcpy(spec,n);
            }
            void set_phone(int a)
            {
                phone=a;
            }
            void set_stream(int a)
            {
                stream=a;
            }
            void show()
            {
                cout<<"Имя "<<name<<endl;
                cout<<"Фамилия "<<surname<<endl;
                cout<<"Отчество "<<fname<<endl;
                cout<<"Адрес "<<adr<<endl;
                cout<<"Телефон "<<phone<<endl;
                cout<<"Группа "<<group<<endl;
                cout<<"Поток "<<stream<<endl;
                cout<<"Специализация "<<spec<<endl;
            }
            void get_name()
            {
                cout<<name<<endl;
            }
            void get_surname()
            {
                cout<<surname<<endl;
            }
            void get_fname()
            {
                cout<<fname<<endl;
            }
            void get_adr()
            {
                cout<<adr<<endl;
            }
            void get_group()
            {
                cout<<group<<endl;
            }
            void get_spec()
            {
                cout<<spec<<endl;
            }
            void set_phone()
            {
                cout<<phone<<endl;
            }
            void set_stream()
            {
                cout<<stream<<endl;
            }
};
typedef student st;
int main()
{   
    char tmp[128];
    int var;
    setlocale(LC_ALL, "");
    st ob1;
    ob1.set_all();
    ob1.show();
    cin.get();
    cout<<"Введите Имя: ";
    cin.getline(tmp,127);
    ob1.set_name(tmp);
    cout<<"Введите Фамилию: ";
    cin.getline(tmp,127);
    ob1.set_surname(tmp);
    cout<<"Введите Отчество: ";
    cin.getline(tmp,127);
    ob1.set_fname(tmp);
    cout<<"Введите Адрес: ";
    cin.getline(tmp,127);
    ob1.set_adr(tmp);
    cout<<"Введите Группу: ";
    cin.getline(tmp,127);
    ob1.set_group(tmp);
    cout<<"Введите Специальность: ";
    cin.getline(tmp,127);
    ob1.set_spec(tmp);
    cout<<"Введите Телефон: ";
    cin>>var;
    ob1.set_phone(var);
    cout<<"Введите Поток: ";
    cin>>var;
    ob1.set_stream(var);
    ob1.show();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.05.2010, 15:11
Ответы с готовыми решениями:

Ввод динамического массива в классе
Не вводятся элементы массива. Как только ввожу второй элемент, пишет что Программа прервана. С рандомными числами работает. Скажите...

Создание динамического массива в классе
Помогите, пожалуйста, разобраться . Пыталась реализовать ввод и вывод элементов динамического массива с помощью класса и функций... ...

Память для динамического массива в классе
Вариант 9. Создать класс MASS1, заданный последовательностью чисел. Реализовать следующие вычисления в виде методов класса: ...

10
6 / 6 / 3
Регистрация: 10.05.2010
Сообщений: 56
26.05.2010, 15:17
попробуй name = new char[len+1];
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.05.2010, 15:19
возможен такой вариант, что вы пытаетесь удалить не выделенную память.
используйте std::string и не мучайтесь
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
26.05.2010, 15:23
Добавь конструктор класса, где установи все указатели в NULL. Плюс для name все таки надо использовать delete [] name;
0
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 15:30  [ТС]
Цитата Сообщение от mih Посмотреть сообщение
попробуй name = new char[len+1];
память выделяется правильно
Добавь конструктор класса, где установи все указатели в NULL. Плюс для name все таки надо использовать delete [] name;
delete [] name; - так тоже виснет, память инициализируется в конструкторе set_all, после этого вызываю set_name.... если убрать удаление то все ок, перед удалением можно написать cout<<name; и оно выводит имя которые было введено в set_all...
возможен такой вариант, что вы пытаетесь удалить не выделенную память.
используйте std::string и не мучайтесь
память выделена... стрингами пользоваться нельзя, таково ТЗ
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
26.05.2010, 15:40

Не по теме:

Цитата Сообщение от Mur3ik Посмотреть сообщение
стрингами пользоваться нельзя
поднял настроение:rofl:


Вопрос на засыпку - какой средой пользуешься?
0
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 15:54  [ТС]
VS2008
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
26.05.2010, 16:00
Интересно, на Билдере работает нормально. А почему ты не используешь статические массивы?
0
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 16:04  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
Интересно, на Билдере работает нормально. А почему ты не используешь статические массивы?
Было все на статике, преподу не понравилось.... сказал что не хорошо, если имя из 2х букв, выделять для этого 20... думаю не в среде дело... а в 2003, по хитрому тут DEP настроен. Надо попробовать в XP.
P.S. если кто-то пользуется VS2008 попробуйте плиз и отпишитесь.
0
6 / 6 / 3
Регистрация: 10.05.2010
Сообщений: 56
26.05.2010, 16:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <clocale>
using namespace std;
 
void main()
{
    char*name;
    char temp[20];
    cin.getline(temp, 127);
    name = new char[strlen(temp)+1];// без +1 виснет
    strcpy(name, temp);
    printf(name);
    delete []name;
}
Добавлено через 45 минут
в общем теория такая что нуль терминатор все таки добавляется(как ни странно),
потому при удалении происходит попытка удалить массив на 1 элемент меньше, отсюда и глюк имхо)
1
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
27.04.2018, 20:53
Привет. Такая проблема, уже неделю не могу разобраться, все перепробовал. Есть класс с динамическим массивом. Массив с разным количеством элементов - треугольный. Нужно сделать массив квадратным. Есть метод в классе, который создает новый массив, копирует туда существующий массив. Старый массив удаляется, а старому указателю присваивается адрес нового массива. Строки удаляются нормально delete[] *строкаМассива, а вот при удалении массива указателей программа тоже зависает - удаляется что-то не то. Помогите, пожалуйста (извините - код на русском)
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
template <typename X>
class массив {
protected:
    int числоСтрок; // m
    int числоСтолбцов; // n
 
    mutable X **указательСтрока; // указатель на массив (на строки)
    X *указательЭлемент; // указатель на элементы строк
    X *конецСтроки; // указатель на конец строки
 
    X **началоМассива; // указатель на начало массива
 
    математика типМатрицы;
 
    bool признакВременности = false; // признак временной матрицы - результата сложения, умножения и т.п. - для передачи для присваивания
public:
 
X **заменитьМассив(X **целевойМассив, X **копируемыйМассив, математика &типЦелевогоМассива, математика типКопируемогоМассива, 
        математика типОперации) {
        // типКопируемогоМассива - тип копируемой матрицы - переменная перечисления "математика"
        // типЦелевогоМассива - тип изменяемой матрицы - переменная перечисления "математика"
        // для копирования массивы должны быть одинакового размера
        // типОперации - выполняемая математическая операция - переменная перечисления "математика"
 
        X **новыйМассив;
        X *новыйЭлемент, *конецСтроки; // указатель на элемент строки целевого массива
        X *копируемыйЭлемент; // указатель на элемент копируемого массива
 
        if (типОперации == математика::сложение || типОперации == математика::вычитание) {
            if ((типЦелевогоМассива == математика::верхняяТреугольнаяМатрица || типЦелевогоМассива == математика::нижняяТреугольнаяМатрица) &&
                типЦелевогоМассива != типКопируемогоМассива) {
                // замена массива на прямоугольный
 
                // создание нового прямоугольного масисва
                новыйМассив = new X *[this->числоСтрок];
                for (int i = 0; i < this->числоСтрок; i++, новыйМассив++) *новыйМассив = new X[this->числоСтолбцов];
 
                новыйМассив -= this->числоСтрок;
 
                // заполнение нулями элементов массива
                for (int строка = 0; строка < this->числоСтрок; строка++, новыйМассив++) {
 
                    новыйЭлемент = *новыйМассив, конецСтроки = новыйЭлемент + this->числоСтолбцов;
                    if (типЦелевогоМассива == математика::нижняяТреугольнаяМатрица) новыйЭлемент = *новыйМассив + строка + 1, конецСтроки = новыйЭлемент + this->числоСтолбцов;
                    if (типЦелевогоМассива == математика::верхняяТреугольнаяМатрица) конецСтроки = новыйЭлемент + строка;
 
                    for ( ; новыйЭлемент < конецСтроки; новыйЭлемент++) *новыйЭлемент = static_cast<X> (0.0);
                }
 
                новыйМассив -= this->числоСтрок;
 
                // копирование элемонтов массива в новый прямоугольный массив
                for (int строка = 0; строка < this->числоСтрок; строка++, новыйМассив++, копируемыйМассив++) {
 
                    новыйЭлемент = *новыйМассив, конецСтроки = новыйЭлемент + this->числоСтолбцов;
                    if (типЦелевогоМассива == математика::нижняяТреугольнаяМатрица) конецСтроки = новыйЭлемент + строка + 1;
                    if (типЦелевогоМассива == математика::верхняяТреугольнаяМатрица) новыйЭлемент += строка;
 
                    for (копируемыйЭлемент = *копируемыйМассив; новыйЭлемент < конецСтроки; новыйЭлемент++, копируемыйЭлемент++) *новыйЭлемент = *копируемыйЭлемент;
                }
 
                новыйМассив -= this->числоСтрок;
                копируемыйМассив -= this->числоСтрок;
 
                for (int i = 0; i < this->числоСтрок; i++, копируемыйМассив++) delete[] *копируемыйМассив; // СТРОКИ УДАЛЯЮТСЯ НОРМАЛЬНО
                delete[] копируемыйМассив; // А ВОТ МАССИВ УКАЗАТЕЛЕЙ ПОЧЕМУ-ТО УДАЛЯЕТ КАКУЮ-ТО НУЖНУЮ ПАМЯТЬ
                cout << "удаление массива" << '\n';
 
                return новыйМассив;
            }
        }
 
        return копируемыйМассив;
    }
 }
Добавлено через 12 минут
если старый массив не удалять - все работает. но, сами понимаете, память утекает

Добавлено через 13 минут
кажется я понял, что я болван. я же после удаления строк не установил указатель на начало массива
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2018, 20:53
Помогаю со студенческими работами здесь

Обьявление и инициализация динамического двумерного массива в классе
Пытаюсь создать в классе динамический двумерный массив, не могу понять что я делаю не так( При вызове деструктора - ошибка class...

Нужно ли сразу знать точный размер динамического массива, объявляемого в классе?
Можно ли сделать так? private: int i; char *p = new char; Или же ему надо сразу знать точный размер?

Удаление динамического массива
Здравствуйте! Имеем код: #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; using namespace...

Удаление динамического массива
есть динамический массив: double** Mas2 = new double*; for(int i=0;i&lt;=kol2;i++) Mas2=new double; Как удалить данный массив...

Удаление динамического массива
Создаю динамический массив целых чисел. Хотелось бы после его создания научиться удалять его, то есть освобождать память. #include...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru