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

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

Войти
Регистрация
Восстановить пароль
 
 
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
#1

new и delete - C++

28.08.2013, 19:07. Просмотров 1173. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос new и delete (C++):

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

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

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

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

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?

New delete - C++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

33
Croessmah
Ушел
13777 / 8027 / 927
Регистрация: 27.09.2012
Сообщений: 19,784
Записей в блоге: 3
Завершенные тесты: 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 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
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 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
28.08.2013, 19:20 #6
Так а на следующий круг (после первого) цикла память выделять не нужно? она же была удалена.
0
Croessmah
Ушел
13777 / 8027 / 927
Регистрация: 27.09.2012
Сообщений: 19,784
Записей в блоге: 3
Завершенные тесты: 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 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
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 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
28.08.2013, 19:25 #10
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
0
Croessmah
Ушел
13777 / 8027 / 927
Регистрация: 27.09.2012
Сообщений: 19,784
Записей в блоге: 3
Завершенные тесты: 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 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
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
Ушел
13777 / 8027 / 927
Регистрация: 27.09.2012
Сообщений: 19,784
Записей в блоге: 3
Завершенные тесты: 1
28.08.2013, 19:28 #15
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
я пробовал и так и вынос делете за цыкл и в цыкле
Мистер Удача!
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
и работала нормально..
И даже access violation не вылез?
1
28.08.2013, 19:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 19:28
Привет! Вот еще темы с ответами:

new[] - delete[] - C++
Всем привет. Глупый вопрос, но тем не менее, он меня крайне заинтересовал. Вот например, есть такой код: void main() { int...

new delete - C++
здраствуйте! назрел вопрос class cls1 { ... ... } class cls2 { ... cls1 *pt = new cls1();

new - delete - C++
Добрый день. Выделяю память для записи 10 значений координат точки. #include &lt;iostream&gt; using namespace std; class point { ...

delete[] - C++
подскажите пожалуйста как заставить это работать? Вылетает на строчке delete. Выделяю ведь память с помощью оператора new. А в идеале...


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

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

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