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

Вычищает ли "мусор" команда delete - C++

Восстановить пароль Регистрация
 
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
22.06.2012, 11:43     Вычищает ли "мусор" команда delete #1
Все-таки добил свою учебную программку.) И созрело пару вопросов. Первый, самый важный : команда delete [] objPat в моем коде вычищает уже не нужные данные с динамической памяти или я что то не так написал? (есть сомнения). И второй вопрос, мой код очень "говнокод" или жить можно?

Класс :
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
#include <iostream>
#include <string>
 
using std::string;
 
class Pat
{
    private :
        float patAge;
        string patName;
    public :
        float GetAge () const;
        void SetAge (float age);
        string GetName () const;
        void SetName (string name);
};
 
float Pat::GetAge () const
{
    return patAge;
}
 
void Pat::SetAge (float age)
{
    patAge=age;
}
 
string Pat::GetName () const
{
    return patName;
}
 
void Pat::SetName (string name)
{
    patName=name;
}
Программа :
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
#include "classPat.h"
#include <stdlib.h>
#include <fstream>
 
using std::cin;
using std::cout;
using std::string;
using std::ofstream;
using std::ifstream;
 
int menu();
int firstMenu();
 
int main ()
{  
    setlocale (LC_ALL, "Russian");
    
    bool exit;
    exit=false;
    string ownerName;
    string patName;
    int amountPats;
    
    Pat *objPat;
    
    for ( ; ; )
    {
        int choice=firstMenu();
        switch(choice)
        {
            case 1 :
                {
                    system("cls");
                    cout<<"Ââåäèòå ГўГ*ГёГҐ èìÿ : ";
                    cin.ignore();
                    getline (cin, ownerName);
                    cout<<"Ââåäèòå êîëè÷åñòâî æèâîòГ*ûõ êîòîðûå êîãäГ* ëèáî æèëè Гі ГўГ*Г± : ";
                    cin>>amountPats;
            
                    objPat=new Pat[amountPats];
                    
                    for (int i=0; i<amountPats; i++)
                    {
                        cout<<"Ââåäèòå èìÿ "<<i+1<<"-ГЈГ® æèâîòГ*îãî : ";
                        cin.ignore();
                        getline (cin, patName);
                        objPat[i].SetName(patName);
                        cout<<"Ââåäèòå âîçðГ*Г±ГІ "<<i+1<<"-ГЈГ® æèâîòГ*îãî : ";
                        float patAge;
                        cin>>patAge;
                        objPat[i].SetAge(patAge);
                    }
                    system("cls");
                    cout<<"\n-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                    cout<<"\nГ‚Г*ГёГҐ èìÿ : "<<ownerName<<"\n";
                    cout<<"Êîëè÷åñòâî ГўГ*ГёГЁГµ ïèòîìöåâ : "<<amountPats<<"\n";
                    cout<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                    for (int i=0; i<amountPats; i++)
                    {
                        cout<<"\nГ„Г*Г*Г*ûå "<<i+1<<"-ГЈГ® ïèòîìöГ* :\n";
                        cout<<"Èìÿ : "<<objPat[i].GetName()<<"\n";
                        cout<<"ÂîçðГ*Г±ГІ (ïîëГ*ûõ ëåò) : "<<objPat[i].GetAge()<<"\n";
                        cout<<"----------------------------------------------\n";
                    }
                    system("pause");
                    system("cls");
                    
                    for ( ; ; )
                    {
                        int choiceTwo=menu();
                        switch (choiceTwo)
                        {
                            case 1 :
                                {
                                    delete [] objPat;
                                    system("cls");
                                    cout<<"Ââåäèòå ГўГ*ГёГҐ èìÿ : ";
                                    cin.ignore();
                                    getline (cin, ownerName);
                                    cout<<"Ââåäèòå êîëè÷åñòâî æèâîòГ*ûõ êîòîðûå êîãäГ* ëèáî æèëè Гі ГўГ*Г± : ";
                                    cin>>amountPats;
            
                                    objPat=new Pat[amountPats];
                    
                                    for (int i=0; i<amountPats; i++)
                                    {
                                        cout<<"Ââåäèòå èìÿ "<<i+1<<"-ГЈГ® æèâîòГ*îãî : ";
                                        cin.ignore();
                                        getline (cin, patName);
                                        objPat[i].SetName(patName);
                                        cout<<"Ââåäèòå âîçðГ*Г±ГІ "<<i+1<<"-ГЈГ® æèâîòГ*îãî : ";
                                        float patAge;
                                        cin>>patAge;
                                        objPat[i].SetAge(patAge);
                                    }
                                    system("cls");
                                    cout<<"\n-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    cout<<"\nГ‚Г*ГёГҐ èìÿ : "<<ownerName<<"\n";
                                    cout<<"Êîëè÷åñòâî ГўГ*ГёГЁГµ ïèòîìöåâ : "<<amountPats<<"\n";
                                    cout<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    for (int i=0; i<amountPats; i++)
                                    {
                                        cout<<"\nГ„Г*Г*Г*ûå "<<i+1<<"-ГЈГ® ïèòîìöГ* :\n";
                                        cout<<"Èìÿ : "<<objPat[i].GetName()<<"\n";
                                        cout<<"ÂîçðГ*Г±ГІ (ïîëГ*ûõ ëåò) : "<<objPat[i].GetAge()<<"\n";
                                        cout<<"----------------------------------------------\n";
                                    }
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                            case 2 :
                                {
                                    system("cls");
                                    ofstream writeFile;
                                    writeFile.open ("proba.txt");
                                    writeFile<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    writeFile<<"\nГ‚Г*ГёГҐ èìÿ : "<<ownerName<<"\n";
                                    writeFile<<"Êîëè÷åñòâî ГўГ*ГёГЁГµ ïèòîìöåâ : "<<amountPats<<"\n";
                                    writeFile<<"-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/";
                                    for (int i=0; i<amountPats; i++)
                                    {
                                        writeFile<<"\nГ„Г*Г*Г*ûå "<<i+1<<"-ГЈГ® ïèòîìöГ* :\n";
                                        writeFile<<"Èìÿ : "<<objPat[i].GetName()<<"\n";
                                        writeFile<<"ÂîçðГ*Г±ГІ (ïîëГ*ûõ ëåò) : "<<objPat[i].GetAge()<<"\n";
                                        writeFile<<"----------------------------------------------";
                                    }
                                    writeFile.close();
                                    cout<<"Г”Г*éë ГіГ±ГЇГҐГёГ*Г® Г§Г*ГЇГЁГ±Г*Г*!\n";
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                            case 3 :
                                {
                                    system("cls");
                                    ifstream is("proba.txt");
                                    if (!is)
                                    {
                                        cout<<"ГЋГёГЁГЎГЄГ*! Г”Г*éë Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГҐГІ!\n";
                                    }
                                    else
                                    {
                                        string fileContain;
                                        while (!is.eof())
                                        {
                                            getline (is, fileContain, '\n');
                                            cout<<fileContain<<"\n";
                                        }
                                    }
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                            case 4 :
                                {
                                    exit=true;
                                    break;
                                }
                            default :
                                {
                                    system("cls");
                                    cout<<"Ââåäèòå ГЇГ°Г*âèëüГ*ûé Г*îìåð Г*ГіГ¦Г*îãî ГЇГіГ*ГЄГІГ*!\n";
                                    system("pause");
                                    system("cls");
                                    break;
                                }
                        }
                        if (exit==true)
                        {
                            break;
                        }
                    }
                    
                    break;
                }
            case 2 :
                {
                    system("cls");
                    ifstream is("proba.txt");
                    if (!is)
                    {
                        cout<<"ГЋГёГЁГЎГЄГ*! Г”Г*éë Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГҐГІ!\n";
                    }
                    else
                    {
                        string fileContain;
                        while (!is.eof())
                        {
                            getline (is, fileContain, '\n');
                            cout<<fileContain<<"\n";
                        }
                    }
                    system("pause");
                    system("cls");
                    break;
                }
            case 3 :
                {
                    exit=true;
                    break;
                }
            default :
                {
                    system("cls");
                    cout<<"Ââåäèòå ГЇГ°Г*âèëüГ*ûé Г*îìåð Г*ГіГ¦Г*îãî ГЇГіГ*ГЄГІГ*!\n";
                    system("pause");
                    system("cls");
                    break;
                }   
        }
        if (exit==true)
        {
            break;
        }
    }
    return 0;
}
 
int menu()
{
    int choice;
    cout<<"                     ГЊГ…ГЌГћ                     \n";
    cout<<"----------------------------------------------\n";
    cout<<"1. ГЌГ*Г·Г*ГІГј Г§Г*ïîëГ*ГҐГ*ГЁГҐ ГІГ*áëèöè\n";
    cout<<"2. Г‡Г*ГЇГЁГ±Г*ГІГј ГІГ*áëèöó Гў ГґГ*éë\n";
    cout<<"3. Ñ÷èòГ*ГІГј ГІГ*áëèöó ГЁГ§ ГґГ*éëГ*\n";
    cout<<"4. Âûõîä\n";
    cout<<"----------------------------------------------\n";
    cout<<"Ââåäèòå Г*îìåð Г*ГіГ¦Г*îãî ГЇГіГ*ГЄГІГ* : ";
    cin>>choice;
    return choice;
}
 
int firstMenu()
{
    int choice;
    cout<<"                     ГЊГ…ГЌГћ                     \n";
    cout<<"----------------------------------------------\n";
    cout<<"1. ГЌГ*Г·Г*ГІГј Г§Г*ïîëГ*ГҐГ*ГЁГҐ ГІГ*áëèöè\n";
    cout<<"2. Ñ÷èòГ*ГІГј ГІГ*áëèöó ГЁГ§ ГґГ*éëГ*\n";
    cout<<"3. Âûõîä\n";
    cout<<"----------------------------------------------\n";
    cout<<"Ââåäèòå Г*îìåð Г*ГіГ¦Г*îãî ГЇГіГ*ГЄГІГ* : ";
    cin>>choice;
    return choice;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:09     Вычищает ли "мусор" команда delete #2
XpertVision, замечание: комментарии. в коде должны быть комментарии.

Добавлено через 39 секунд
У тебя русский нормально выводится?

Добавлено через 45 секунд
C++
1
2
3
4
5
using std::cin;
using std::cout;
using std::string;
using std::ofstream;
using std::ifstream;

C++
1
using namespace std;
тогда уж
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
22.06.2012, 12:10     Вычищает ли "мусор" команда delete #3
C++
1
#include <clocale>
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:12     Вычищает ли "мусор" команда delete #4
C++
1
void SetName (string name);
Представь, если name.length() == 255,
то ему придется копировать 255 символов
А если написать "(string &name)", то передастся ссылка на объект. (Считай, константный указатель)

Добавлено через 53 секунды
C++
1
 setlocale (LC_ALL, "Russian");
Локаль не на всех компьютерах работает. Лучше использовать CharToOem(char*, char*);
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
22.06.2012, 12:12  [ТС]     Вычищает ли "мусор" команда delete #5
Цитата Сообщение от Ksan Посмотреть сообщение
XpertVision, замечание: комментарии. в коде должны быть комментарии.

Добавлено через 39 секунд
У тебя русский нормально выводится?

Добавлено через 45 секунд
C++
1
2
3
4
5
using std::cin;
using std::cout;
using std::string;
using std::ofstream;
using std::ifstream;

C++
1
using namespace std;
тогда уж
Да, про коментарии что то забыл, надо дописать сейчас.

Русский нормально выводится. Но если на русском ввести в стринг, то выведет караказябру..решения пока не нашол.

Я люблю по одной добавлять. В книге по которой изучаю говорилось что могут быть проблемы в некоторых случаях если все под стандартное простарнство имен загребти.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:14     Вычищает ли "мусор" команда delete #6
C++
1
2
ofstream writeFile;
                                    writeFile.open ("proba.txt");
C++
1
ofstream writeFile ("proba.txt");
Лучше второе
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
22.06.2012, 12:15  [ТС]     Вычищает ли "мусор" команда delete #7
Цитата Сообщение от Ksan Посмотреть сообщение
C++
1
void SetName (string name);
Представь, если name.length() == 255,
то ему придется копировать 255 символов
А если написать "(string &name)", то передастся ссылка на объект. (Считай, константный указатель)

Добавлено через 53 секунды
C++
1
 setlocale (LC_ALL, "Russian");
Локаль не на всех компьютерах работает. Лучше использовать CharToOem(char*, char*);
Про ссылку огромное спасибо) Надо запомнить. Локаль на 7 всегда рабтает, проблемы только на хрюше (из своего опыта). Но мне в принципе для себя это..так что пока перебьюсь.)

Добавлено через 36 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
#include <clocale>
Зачем?
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:15     Вычищает ли "мусор" команда delete #8
Цитата Сообщение от XpertVision Посмотреть сообщение
Да, про коментарии что то забыл, надо дописать сейчас.

Русский нормально выводится. Но если на русском ввести в стринг, то выведет караказябру..решения пока не нашол.

Я люблю по одной добавлять. В книге по которой изучаю говорилось что могут быть проблемы в некоторых случаях если все под стандартное простарнство имен загребти.

2) CharToOem - почитай

3) в больших - да. в твоей- нет
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
22.06.2012, 12:17  [ТС]     Вычищает ли "мусор" команда delete #9
Спасибо за советы, пойду гляну что это за зверь.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.06.2012, 13:42     Вычищает ли "мусор" команда delete #10
Цитата Сообщение от Ksan Посмотреть сообщение
Представь, если name.length() == 255,
то ему придется копировать 255 символов
А если написать "(string &name)", то передастся ссылка на объект. (Считай, константный указатель)
Тогда лучше "const string &name". Модификатор const спасёт от собственных же ошибок и не даст внутри SetName испортить переменную в точке вызова

Цитата Сообщение от XpertVision Посмотреть сообщение
Я люблю по одной добавлять. В книге по которой изучаю говорилось что могут быть проблемы в некоторых случаях если все под стандартное простарнство имен загребти
Тогда лучше вообще ничего не добавлять, а писать std::cout, std::string и т.п.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.06.2012, 14:19     Вычищает ли "мусор" команда delete #11
XpertVision, могу дать пример фигни:
C++
1
2
3
4
5
6
7
8
uint8_t factorial(unsigned long int n)
{
 if (n==0)
 {
  return 1;
 }
 return n*factorial(n-1);
}
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
23.06.2012, 01:24  [ТС]     Вычищает ли "мусор" команда delete #12
Цитата Сообщение от taras atavin Посмотреть сообщение
XpertVision, могу дать пример фигни:
C++
1
2
3
4
5
6
7
8
uint8_t factorial(unsigned long int n)
{
 if (n==0)
 {
  return 1;
 }
 return n*factorial(n-1);
}
Если честно, не понял к чему эта функция.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
23.06.2012, 05:49     Вычищает ли "мусор" команда delete #13
XpertVision, класс должен быть в стражах
C++
1
2
3
4
#ifndef _CLASS_NAME_
#define _CLASS_NAME_
//class
#endif
В классе никаких using std::string/using namespace std и прочих. В своем cpp творите что хотите, а тут ни-ни.
Класс не шаблонный - можно разбить на два файла, чтобы пользоваться раздельной компиляцией.

Код не читал, это общие замечания.

команда delete [] objPat в моем коде вычищает уже не нужные данные с динамической памяти
Нет. Посчитайте, сколько у вас выделений памяти и сколько очищений.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
23.06.2012, 13:09  [ТС]     Вычищает ли "мусор" команда delete #14
Цитата Сообщение от soon Посмотреть сообщение

Нет. Посчитайте, сколько у вас выделений памяти и сколько очищений.
Два выделение и одно очищение. Но тут так задумано. Выделяется и очищается или при выходе из программы (самой програмой), или перед созданеем нового объекта. (старый удяляется и новый создается). Во вложениее файл, схематически нарисовал то что происходит с объектом.
Миниатюры
Вычищает ли "мусор" команда delete  
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
23.06.2012, 13:30     Вычищает ли "мусор" команда delete #15
Цитата Сообщение от XpertVision Посмотреть сообщение
(самой програмой)
Не самой программой, а ОС будет чистить за Вас.

Добавлено через 5 минут
И еще - exit - является так же именем стандартной функции, советую поменять имя переменной.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
23.06.2012, 17:21     Вычищает ли "мусор" команда delete #16
XpertVision, запомните: все то, что вы явно выделяете вы должны также явно освободить. Без вариантов.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
23.06.2012, 17:39  [ТС]     Вычищает ли "мусор" команда delete #17
Цитата Сообщение от soon Посмотреть сообщение
XpertVision, запомните: все то, что вы явно выделяете вы должны также явно освободить. Без вариантов.
Во втором цыкле for, в конце в if добавил строчку с освобождение динамической памяти, теперь он выглядит так :
C++
1
2
3
4
5
if (myExit==true)
{
   delete [] objPat;
   break;
}
Вы это имели ввиду под явный удалением? (выходит что когда я выхожу из программы, она сама вычисчает за собой "мусор", а не сваливает все на ОС)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
23.06.2012, 18:26     Вычищает ли "мусор" команда delete #18
XpertVision, У вас довольно большие степени вложенности, и, если честно, мне лень проверять. Но на первый взгляд все вроде работает. Можете скачать любой менеджер по утечкам памяти и прогнать через него.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
23.06.2012, 19:13  [ТС]     Вычищает ли "мусор" команда delete #19
А какие менеджеры по утечкам вы бы посоветовали? А то гугл внятного ничего не предлогает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 19:22     Вычищает ли "мусор" команда delete
Еще ссылки по теме:

C++ Ошибка с delete [] - "CRT detected that the application wrote to memory after end of heap buffer"
Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error" C++
Delete [] "вызвал срабатывание точки останова" C++

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
23.06.2012, 19:22     Вычищает ли "мусор" команда delete #20
Пользуюсь valgrind. Не знаю, если ли под винду, на Вики только про линь и мак сказано.
Yandex
Объявления
23.06.2012, 19:22     Вычищает ли "мусор" команда delete
Ответ Создать тему
Опции темы

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