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

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

Войти
Регистрация
Восстановить пароль
 
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
#1

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

26.05.2010, 15:11. Просмотров 987. Ответов 9
Метки нет (Все метки)

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

зависание в методе 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2010, 15:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление динамического массива в классе (C++):

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

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

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

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

Удаление динамического массива - C++
Здравствуйте! Имею следующий вопрос: создаётся массив таким образом: int elCount = 10; double* x = new double;

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

9
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
26.05.2010, 15:17 #2
попробуй name = new char[len+1];
0
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.05.2010, 15:19 #3
возможен такой вариант, что вы пытаетесь удалить не выделенную память.
используйте std::string и не мучайтесь
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
26.05.2010, 15:23 #4
Добавь конструктор класса, где установи все указатели в NULL. Плюс для name все таки надо использовать delete [] name;
0
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 15:30  [ТС] #5
Цитата Сообщение от mih Посмотреть сообщение
попробуй name = new char[len+1];
память выделяется правильно
Добавь конструктор класса, где установи все указатели в NULL. Плюс для name все таки надо использовать delete [] name;
delete [] name; - так тоже виснет, память инициализируется в конструкторе set_all, после этого вызываю set_name.... если убрать удаление то все ок, перед удалением можно написать cout<<name; и оно выводит имя которые было введено в set_all...
возможен такой вариант, что вы пытаетесь удалить не выделенную память.
используйте std::string и не мучайтесь
память выделена... стрингами пользоваться нельзя, таково ТЗ
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
26.05.2010, 15:40 #6

Не по теме:

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


Вопрос на засыпку - какой средой пользуешься?
0
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 15:54  [ТС] #7
VS2008
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
26.05.2010, 16:00 #8
Интересно, на Билдере работает нормально. А почему ты не используешь статические массивы?
0
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 16:04  [ТС] #9
Цитата Сообщение от kazak Посмотреть сообщение
Интересно, на Билдере работает нормально. А почему ты не используешь статические массивы?
Было все на статике, преподу не понравилось.... сказал что не хорошо, если имя из 2х букв, выделять для этого 20... думаю не в среде дело... а в 2003, по хитрому тут DEP настроен. Надо попробовать в XP.
P.S. если кто-то пользуется VS2008 попробуйте плиз и отпишитесь.
0
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
26.05.2010, 16:59 #10
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
26.05.2010, 16:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2010, 16:59
Привет! Вот еще темы с ответами:

Удаление динамического массива - C++
Привет. Сделал программу с 3 динамическими массивами, но дело в том, что 2 из них, размер которых задается с клавиатуры, удаляются в конце...

Удаление динамического массива - C++
Всем привет!!! Столкнулся со следующей проблемой. В литературе оговоренно, что для удаления всего массива из динамической памяти,...

Удаление динамического массива - C++
Доброго времени суток! Задача такова, что надо организовать бесконечный ввод в массив. Ввод прекращается после 0. Возникла проблема:...

Удаление динамического массива - C++
доброго времени суток. написал программу, в которой создается динамический массив. с ним проводим определенные операции, а в конце надо его...


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

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

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