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

new и delete

28.08.2013, 19:07. Просмотров 1871. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2013, 19:07
Ответы с готовыми решениями:

Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться
Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться. кто сможет?...

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

Какая разница между delete и delete[]
Нашел информацию на разных сайтах и всё равно остались вопросы. Я понимаю, что delete используется...

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

33
Don't worry, be happy
16921 / 9797 / 1887
Регистрация: 27.09.2012
Сообщений: 24,294
Записей в блоге: 2
28.08.2013, 19:09 2
Когда выделенная память больше не нужна.

C++
1
char *buff = new char;
И это выделение всего одного char'а
2
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:11  [ТС] 3
т.е в моем случае лучше очищать в конце цикла?
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,226
28.08.2013, 19:16 4
-J_O_K_E_R-, что то я не могу понять твоего кода, видимо потому что не знаком с библиотекой stdio, как я понимаю sprintf это cin, а printf - cout, но как я понимаю код косячный, т.к. после первого же выполнения цикла, buff будет удалена, а для ввода нового значения память не будет выделена.
0
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
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,226
28.08.2013, 19:20 6
Так а на следующий круг (после первого) цикла память выделять не нужно? она же была удалена.
0
Don't worry, be happy
16921 / 9797 / 1887
Регистрация: 27.09.2012
Сообщений: 24,294
Записей в блоге: 2
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
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,226
28.08.2013, 19:23 8
Цитата Сообщение от Croessmah Посмотреть сообщение
В вашем случае вообще программа скорее всего упадет.
не скорее всего, а упадет, проверено только что

В данном коде buff надо удалять после цикла.
0
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
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,226
28.08.2013, 19:25 10
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
0
Don't worry, be happy
16921 / 9797 / 1887
Регистрация: 27.09.2012
Сообщений: 24,294
Записей в блоге: 2
28.08.2013, 19:26 11
Цитата Сообщение от VLK Посмотреть сообщение
В данном коде buff надо удалять после цикла.
Это не поможет, ибо там еще запись за пределы выделенной памяти. И если это устранить, то получиться не много не то. В общем все изменения в посте #7
1
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:26  [ТС] 12
Цитата Сообщение от VLK Посмотреть сообщение
-J_O_K_E_R-, глупый наверное вопрос, какая цель данной программы
щас на VS 2012 проверю....
на GCC не падает когда очистка в конце цикла
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,226
28.08.2013, 19:26 13
Ладно, не буду лезть, т.к. не знаю библиотеки stdio
1
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:28  [ТС] 14
Цитата Сообщение от VLK Посмотреть сообщение
В том, что у тебя в первом сообщении не может ни чего расти, там после первого круга цикла программа упадет
ты не понял....

прирост в другом коде...
а на этом я тренерусь очищать память и изучаю операторы
0
Don't worry, be happy
16921 / 9797 / 1887
Регистрация: 27.09.2012
Сообщений: 24,294
Записей в блоге: 2
28.08.2013, 19:28 15
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
я пробовал и так и вынос делете за цыкл и в цыкле
Мистер Удача!
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
и работала нормально..
И даже access violation не вылез?
1
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:29  [ТС] 16
Цитата Сообщение от Croessmah Посмотреть сообщение
Мистер Удача!

И даже access violation не вылез?
хочешь скину прогу откомпилированную в GCC и с очисткой внутри цикла
0
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  
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,226
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
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:36  [ТС] 19
уже разобрался....

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

все спасибо разобрался
0
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  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2013, 19:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Есть ли операторы new, new[], delete, delete[]
Есть ли операторы new, new, delete, delete в Си? И, если есть, чем они отличаются? Тихо...

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

Клавиша delete не работает,а вот shift + delete работает
Ни ничего не могу удалить как обычно клавишей delete работает только при сочетании shift + delete...

Delete или delete []
Здравствуйте. Написал программу которая создает динамический массив, заполняемый нулями и выводит...


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

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

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