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

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

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

new и delete - C++

28.08.2013, 19:07. Просмотров 1081. Ответов 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 (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; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:29  [ТС] #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Мистер Удача!

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

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

все спасибо разобрался
-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
Миниатюры
new и delete   new и delete  
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
28.08.2013, 19:45 #21
-J_O_K_E_R-, ох.. а delete где? конечно он будет, ты выделил память, записал в нее, а потом со следующего круга выделил новую, старая при этом осталась и доступ к ней теряется.
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:48  [ТС] #22
Цитата Сообщение от VLK Посмотреть сообщение
-J_O_K_E_R-, ох.. а delete где? конечно он будет, ты выделил память, записал в нее, а потом со следующего круга выделил новую, старая при этом осталась и доступ к ней теряется.
да просто код делался под одно выполнение а потом надо было сделать по 2ляма
и заметил утечку....

теперь хочу перевести все char на динамическое выделение а не фиксированное...
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
28.08.2013, 19:49 #23
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
теперь хочу перевести все char на динамическое выделение а не фиксированное...
амбициозные планы
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2013, 19:49 #24
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
все парни спасибо разобрался где утечка памяти
По данным диспетчера задач винды нельзя сказать есть утечка или нет

Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
теперь хочу перевести все char на динамическое выделение а не фиксированное...
только зачем это нужно?
-J_O_K_E_R-
3 / 3 / 0
Регистрация: 29.07.2013
Сообщений: 82
28.08.2013, 19:50  [ТС] #25
Цитата Сообщение от VLK Посмотреть сообщение
амбициозные планы
я еще начинаю программировать на С++

косяки делаю...
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
29.08.2013, 00:39 #26
C++
1
2
        char *buff = new char;
        sprintf(buff,"%d",i);
Рано или поздно упадет
Убежденный
Системный программист
Эксперт С++
15511 / 7009 / 1108
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
29.08.2013, 08:50 #27
Цитата Сообщение от -J_O_K_E_R- Посмотреть сообщение
for(int i=0; i<90000000000; i++)
Слишком большое значение для int. Оно будет усечено.
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
29.08.2013, 09:22 #28
Цитата Сообщение от Jupiter Посмотреть сообщение
По данным диспетчера задач винды нельзя сказать есть утечка или нет
Поясните пожалуйста.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.08.2013, 12:12 #29
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Поясните пожалуйста.
что пояснить? диспетчер задач это для домохозяек для отслеживание утечек памяти нужно использовать спец. средства VLD/функции crt/valgrind
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
29.08.2013, 12:16 #30
Цитата Сообщение от Jupiter Посмотреть сообщение
диспетчер задач это для домохозяек для отслеживание утечек памяти нужно использовать спец. средства VLD/функции crt/valgrind
Конечно. Но нельзя так вот утверждать, что по диспетчеру задач вообще невозможно проследить сам факт утечки. Я вот за что.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2013, 12:16
Привет! Вот еще темы с ответами:

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. А в идеале...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.08.2013, 12:16
Ответ Создать тему
Опции темы

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