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

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

Войти
Регистрация
Восстановить пароль
 
 
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 151
#1

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

22.06.2012, 11:43. Просмотров 827. Ответов 19
Метки нет (Все метки)

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

Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error" - C++
Здравствуйте. Возникла проблема с оператором &quot;delete&quot;. Пользуюсь VisualStudio 2010. Программа компилируется нормально. Все отрабатывает....

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

Почему переменной присваивается произвольное значение("мусор")? - C++
Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но переменной х я присваиваю значение 0. Если после приглашения...

Аналог рекурсивной функции, отображающей строку в обратном порядке, выводит "мусор" - C++
Добрый день, при попытке написать аналог рекурсивной функции отображающей строку в обратном порядке напоролся на грабли: #include...

Выводит "мусор" при считывании файла - C++
Вывод // (c) vladyxa13 #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;locale&gt; #include &lt;fstream&gt; using namespace std; ...

19
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:09 #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;
тогда уж
1
MrGluck
Модератор
Эксперт CЭксперт С++
7492 / 4607 / 693
Регистрация: 29.11.2010
Сообщений: 12,604
22.06.2012, 12:10 #3
C++
1
#include <clocale>
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:12 #4
C++
1
void SetName (string name);
Представь, если name.length() == 255,
то ему придется копировать 255 символов
А если написать "(string &name)", то передастся ссылка на объект. (Считай, константный указатель)

Добавлено через 53 секунды
C++
1
 setlocale (LC_ALL, "Russian");
Локаль не на всех компьютерах работает. Лучше использовать CharToOem(char*, char*);
1
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 151
22.06.2012, 12:12  [ТС] #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;
тогда уж
Да, про коментарии что то забыл, надо дописать сейчас.

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

Я люблю по одной добавлять. В книге по которой изучаю говорилось что могут быть проблемы в некоторых случаях если все под стандартное простарнство имен загребти.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:14 #6
C++
1
2
ofstream writeFile;
                                    writeFile.open ("proba.txt");
C++
1
ofstream writeFile ("proba.txt");
Лучше второе
0
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 151
22.06.2012, 12:15  [ТС] #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>
Зачем?
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
22.06.2012, 12:15 #8
Цитата Сообщение от XpertVision Посмотреть сообщение
Да, про коментарии что то забыл, надо дописать сейчас.

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

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

2) CharToOem - почитай

3) в больших - да. в твоей- нет
1
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 151
22.06.2012, 12:17  [ТС] #9
Спасибо за советы, пойду гляну что это за зверь.
0
Evg
Эксперт CАвтор FAQ
18264 / 6389 / 440
Регистрация: 30.03.2009
Сообщений: 17,674
Записей в блоге: 28
22.06.2012, 13:42 #10
Цитата Сообщение от Ksan Посмотреть сообщение
Представь, если name.length() == 255,
то ему придется копировать 255 символов
А если написать "(string &name)", то передастся ссылка на объект. (Считай, константный указатель)
Тогда лучше "const string &name". Модификатор const спасёт от собственных же ошибок и не даст внутри SetName испортить переменную в точке вызова

Цитата Сообщение от XpertVision Посмотреть сообщение
Я люблю по одной добавлять. В книге по которой изучаю говорилось что могут быть проблемы в некоторых случаях если все под стандартное простарнство имен загребти
Тогда лучше вообще ничего не добавлять, а писать std::cout, std::string и т.п.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.06.2012, 14:19 #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);
}
0
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 151
23.06.2012, 01:24  [ТС] #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);
}
Если честно, не понял к чему эта функция.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
23.06.2012, 05:49 #13
XpertVision, класс должен быть в стражах
C++
1
2
3
4
#ifndef _CLASS_NAME_
#define _CLASS_NAME_
//class
#endif
В классе никаких using std::string/using namespace std и прочих. В своем cpp творите что хотите, а тут ни-ни.
Класс не шаблонный - можно разбить на два файла, чтобы пользоваться раздельной компиляцией.

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

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

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

Добавлено через 5 минут
И еще - exit - является так же именем стандартной функции, советую поменять имя переменной.
1
23.06.2012, 13:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 13:30
Привет! Вот еще темы с ответами:

Индекс элемента массива, для которого значение функции - минимально. "Мусор в выводе" - C++
Собственно поставлена следующая задача: Разработать функцию P, находящую индекс элемента массива Х, для которого зачение функции f...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Есть в языке "С" аналоги функций Pos() и Delete()? - C++
Если есть, то напишите.

Непонятки с оператором "delete" У меня изумление. Крашится программа (Qt5.5) Win 8 - C++
Я никак не могу найти ошибку, из-за которой срабатывание операторы delete приводит к крашу программы. Я пытался отыскать проблему в том,...


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

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

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