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

new и delete - C++

Восстановить пароль Регистрация
 
 
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:07     new и delete #1
как лучше очищать память?

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;
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 19:07     new и delete
Посмотрите здесь:

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
C++ delete[]
new - delete C++
C++ new и delete
C++ delete this
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:09     new и delete #2
Когда выделенная память больше не нужна.

C++
1
char *buff = new char;
И это выделение всего одного char'а
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:11  [ТС]     new и delete #3
т.е в моем случае лучше очищать в конце цикла?
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:16     new и delete #4
-J_O_K_E_R-, что то я не могу понять твоего кода, видимо потому что не знаком с библиотекой stdio, как я понимаю sprintf это cin, а printf - cout, но как я понимаю код косячный, т.к. после первого же выполнения цикла, buff будет удалена, а для ввода нового значения память не будет выделена.
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:18  [ТС]     new и delete #5
Цитата Сообщение от VLK Посмотреть сообщение
-J_O_K_E_R-, что то я не могу понять твоего кода, видимо потому что не знаком с библиотекой stdio, как я понимаю sprintf это cin, а printf cout, но как я понимаю код косячный, т.к. после первого же выполнения цикла, buff будет удалена, а для ввода нового значения память не будет выделена.
выделяем память (динамическую)
запускаем цикл
загоняем текущее значение i в память
выводим на экран
очищаем память
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:20     new и delete #6
Так а на следующий круг (после первого) цикла память выделять не нужно? она же была удалена.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:21     new и delete #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;    
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:23     new и delete #8
Цитата Сообщение от Croessmah Посмотреть сообщение
В вашем случае вообще программа скорее всего упадет.
не скорее всего, а упадет, проверено только что

В данном коде buff надо удалять после цикла.
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:24  [ТС]     new и delete #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 перестало рости...

думаю под динамическое выделение переделать
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:25     new и delete #10
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:26     new и delete #11
Цитата Сообщение от VLK Посмотреть сообщение
В данном коде buff надо удалять после цикла.
Это не поможет, ибо там еще запись за пределы выделенной памяти. И если это устранить, то получиться не много не то. В общем все изменения в посте #7
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:26  [ТС]     new и delete #12
Цитата Сообщение от VLK Посмотреть сообщение
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
щас на VS 2012 проверю....
на GCC не падает когда очистка в конце цикла
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:26     new и delete #13
Ладно, не буду лезть, т.к. не знаю библиотеки stdio
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:28  [ТС]     new и delete #14
Цитата Сообщение от VLK Посмотреть сообщение
В том, что у тебя в первом сообщении не может ни чего расти, там после первого круга цикла программа упадет
ты не понял....

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

И даже access violation не вылез?
хочешь скину прогу откомпилированную в GCC и с очисткой внутри цикла
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:32  [ТС]     new и delete #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;
    
}
Миниатюры
new и delete  
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:34     new и delete #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;
}
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:36  [ТС]     new и delete #19
уже разобрался....

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

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

C++ delete[]
delete[] *pointer vs. delete pointer и утечка памяти C++
New/Delete C++

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

Или воспользуйтесь поиском по форуму:
-J_O_K_E_R-
 Аватар для -J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:44  [ТС]     new и delete #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
Миниатюры
new и delete   new и delete  
Yandex
Объявления
28.08.2013, 19:44     new и delete
Ответ Создать тему
Опции темы

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