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

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

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

new и delete - C++

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

new и delete - C++
Ошибка, незнаю как для моего класса выделить память. Как исправить? class MyClass { int a, b, c; public: MyClass(int a,...

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

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

delete[] - C++
Здравствуйте! Имеется след. код: char* values = new char; values = '\0'; ////ещё код//// delete values; Вопрос - почему...

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

delete this - C++
Добрый день! У меня возник такой вопрос - почему в программе возникает неопределённое поведение для объекта, в деструкторе которого...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
28.08.2013, 19:09     new и delete #2
Когда выделенная память больше не нужна.

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

В данном коде buff надо удалять после цикла.
-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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
28.08.2013, 19:25     new и delete #10
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
28.08.2013, 19:26     new и delete #11
Цитата Сообщение от VLK Посмотреть сообщение
В данном коде buff надо удалять после цикла.
Это не поможет, ибо там еще запись за пределы выделенной памяти. И если это устранить, то получиться не много не то. В общем все изменения в посте #7
-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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
28.08.2013, 19:26     new и delete #13
Ладно, не буду лезть, т.к. не знаю библиотеки stdio
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:28  [ТС]     new и delete #14
Цитата Сообщение от VLK Посмотреть сообщение
В том, что у тебя в первом сообщении не может ни чего расти, там после первого круга цикла программа упадет
ты не понял....

прирост в другом коде...
а на этом я тренерусь очищать память и изучаю операторы
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:29  [ТС]     new и delete #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Мистер Удача!

И даже access violation не вылез?
хочешь скину прогу откомпилированную в GCC и с очисткой внутри цикла
-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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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-
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
Еще ссылки по теме:

New/Delete - C++
нужно рассмотреть конкретную ситуацию: область, выделенная желтым цветом будет очищена, при использовании delete, область выделенная...

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

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

ошибка delete [] - C++
string res = &quot;asd&quot;; char* temp = new char; strcpy(temp, res.c_str()); //------- delete temp; когда выполняется последняя строка,...

Delete and Destructor - C++
Привет! :) Есть следующий код, в нем есть реализация сложения матриц. Matrix.cpp Matrix::Matrix(int m, int n) { row_ = m; ...


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

Или воспользуйтесь поиском по форуму:
-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
Ответ Создать тему
Опции темы

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