Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
1

new и delete

28.08.2013, 19:07. Просмотров 1200. Ответов 33
Метки нет (Все метки)

как лучше очищать память?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
 
//как лучще очищать память?
int main(){
    char *buff = new char;
        
for(int i=0; i<90000000000; i++){
        
        sprintf(buff,"%d",i);
        printf(buff,"%d");
        delete buff; // так?
    }
    //delete buff; или так?
    system("pause");
    return 0;
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 19:07
Ответы с готовыми решениями:

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю,...

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем...

Чем отличается delete[] от delete?
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет...

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

33
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:09 2
Когда выделенная память больше не нужна.

C++
1
char *buff = new char;
И это выделение всего одного char'а
2
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:11  [ТС] 3
т.е в моем случае лучше очищать в конце цикла?
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,199
28.08.2013, 19:16 4
-J_O_K_E_R-, что то я не могу понять твоего кода, видимо потому что не знаком с библиотекой stdio, как я понимаю sprintf это cin, а printf - cout, но как я понимаю код косячный, т.к. после первого же выполнения цикла, buff будет удалена, а для ввода нового значения память не будет выделена.
0
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:18  [ТС] 5
Цитата Сообщение от VLK Посмотреть сообщение
-J_O_K_E_R-, что то я не могу понять твоего кода, видимо потому что не знаком с библиотекой stdio, как я понимаю sprintf это cin, а printf cout, но как я понимаю код косячный, т.к. после первого же выполнения цикла, buff будет удалена, а для ввода нового значения память не будет выделена.
выделяем память (динамическую)
запускаем цикл
загоняем текущее значение i в память
выводим на экран
очищаем память
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,199
28.08.2013, 19:20 6
Так а на следующий круг (после первого) цикла память выделять не нужно? она же была удалена.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:21 7
В вашем случае вообще программа скорее всего упадет.
Попробуйте как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
int main(){
    char *buff = new char [ 15 ] ;
        
for(int i=0; i<9000000000;i++){        
        sprintf(buff,"%d",i);
        printf("%s\n" , buff);
    }
    delete [] buff;
    system("pause");
    return 0;    
}
1
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,199
28.08.2013, 19:23 8
Цитата Сообщение от Croessmah Посмотреть сообщение
В вашем случае вообще программа скорее всего упадет.
не скорее всего, а упадет, проверено только что

В данном коде buff надо удалять после цикла.
0
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:24  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
В вашем случае вообще программа скорее всего упадет.
Попробуйте как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
int main(){
    char *buff = new char [ 15 ] ;
        
for(int i=0; i<9000000000;i++){        
        sprintf(buff,"%d",i);
        printf("%s\n" , buff);
    }
    delete [] buff;
    system("pause");
    return 0;    
}
я пробовал и так и вынос делете за цыкл и в цыкле
и работала нормально..


просто у меня код есть, при его выполнении оперативка растет с геометрической прогресии
добавил в конце цыкла memset перестало рости...

думаю под динамическое выделение переделать
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,199
28.08.2013, 19:25 10
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:26 11
Цитата Сообщение от VLK Посмотреть сообщение
В данном коде buff надо удалять после цикла.
Это не поможет, ибо там еще запись за пределы выделенной памяти. И если это устранить, то получиться не много не то. В общем все изменения в посте #7
1
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:26  [ТС] 12
Цитата Сообщение от VLK Посмотреть сообщение
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
щас на VS 2012 проверю....
на GCC не падает когда очистка в конце цикла
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,199
28.08.2013, 19:26 13
Ладно, не буду лезть, т.к. не знаю библиотеки stdio
1
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:28  [ТС] 14
Цитата Сообщение от VLK Посмотреть сообщение
В том, что у тебя в первом сообщении не может ни чего расти, там после первого круга цикла программа упадет
ты не понял....

прирост в другом коде...
а на этом я тренерусь очищать память и изучаю операторы
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:28 15
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
я пробовал и так и вынос делете за цыкл и в цыкле
Мистер Удача!
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
и работала нормально..
И даже access violation не вылез?
1
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:29  [ТС] 16
Цитата Сообщение от Croessmah Посмотреть сообщение
Мистер Удача!

И даже access violation не вылез?
хочешь скину прогу откомпилированную в GCC и с очисткой внутри цикла
0
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:32  [ТС] 17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
 
 
int main(){
    char *buff = new char;
        
for(int i=0; i<90000000000; i++){
        
        sprintf(buff,"%d",i);
        printf(buff,"%d");
        delete buff; 
    }
    
    system("pause");
    return 0;
    
}
0
Миниатюры
new и delete  
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,199
28.08.2013, 19:34 18
-J_O_K_E_R-,
1. ты выделил память под buff
2. начинается цикл
3. в цикле ты вводишь buff и потом его печатаешь
4. потом ты удаляешь buff (очищаешь память)

следующий круг цикла у тебя начинается с пункта 2, но только куда ты будешь записывать buff, если память удалена на прошлом круге, а новая не выделена?

вариантов много, поместить char *buff = new char; в цикл или delete buff; поставить после цикла или вообще сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
char *buff;
 
for(int i = 0; i < 5; i++)
{
buff = new char;
cin >> buff;
cout << buff << endl;
delete buff;
}
 
system("pause");
return 0;
}
1
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:36  [ТС] 19
уже разобрался....

VS 2012 с warning all делает код, но программа вылетает не начавшись..

все спасибо разобрался
0
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:44  [ТС] 20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
 
 
int main(){
    
        
for(int i=0; i<90000000000; i++){
        char *buff = new char;
        sprintf(buff,"%d",i);
        printf(buff,"%d");
        //delete buff; 
    }
    
    system("pause");
    return 0;
    
}
вот он тот самый прирост о котором я спрашивал...

все парни спасибо разобрался где утечка памяти

компилировал на VS 2012
0
Миниатюры
new и delete   new и delete  
28.08.2013, 19:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 19:44

delete[]
Здравствуйте! Имеется след. код: char* values = new char; values = '\0';...

New/Delete
нужно рассмотреть конкретную ситуацию: область, выделенная желтым цветом будет...

new и delete
Ошибка, незнаю как для моего класса выделить память. Как исправить? ...


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

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

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