Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 15:11     Удаление динамического массива в классе #1
при удаление динамического массива в классе зависает программа... хотя в инете нашел кучу примеров, где написано точно также....

зависание в методе 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2010, 15:11     Удаление динамического массива в классе
Посмотрите здесь:

Удаление динамического массива C++
Удаление динамического массива строк C++
Удаление динамического массива C++
Удаление динамического массива C++
Удаление динамического массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
26.05.2010, 15:17     Удаление динамического массива в классе #2
попробуй name = new char[len+1];
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.05.2010, 15:19     Удаление динамического массива в классе #3
возможен такой вариант, что вы пытаетесь удалить не выделенную память.
используйте std::string и не мучайтесь
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.05.2010, 15:23     Удаление динамического массива в классе #4
Добавь конструктор класса, где установи все указатели в NULL. Плюс для name все таки надо использовать delete [] name;
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 и не мучайтесь
память выделена... стрингами пользоваться нельзя, таково ТЗ
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.05.2010, 15:40     Удаление динамического массива в классе #6

Не по теме:

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


Вопрос на засыпку - какой средой пользуешься?
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 15:54  [ТС]     Удаление динамического массива в классе #7
VS2008
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.05.2010, 16:00     Удаление динамического массива в классе #8
Интересно, на Билдере работает нормально. А почему ты не используешь статические массивы?
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 16:04  [ТС]     Удаление динамического массива в классе #9
Цитата Сообщение от kazak Посмотреть сообщение
Интересно, на Билдере работает нормально. А почему ты не используешь статические массивы?
Было все на статике, преподу не понравилось.... сказал что не хорошо, если имя из 2х букв, выделять для этого 20... думаю не в среде дело... а в 2003, по хитрому тут DEP настроен. Надо попробовать в XP.
P.S. если кто-то пользуется VS2008 попробуйте плиз и отпишитесь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2010, 16:59     Удаление динамического массива в классе
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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 элемент меньше, отсюда и глюк имхо)
Yandex
Объявления
26.05.2010, 16:59     Удаление динамического массива в классе
Ответ Создать тему
Опции темы

Текущее время: 08:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru