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

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

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Нужно ли освобождать память перед повторым выделением? - C++

23.02.2013, 22:03. Просмотров 510. Ответов 8
Метки нет (Все метки)

к примеру мы имеем:
C++
1
2
3
char *itsString = new char[1];
delete [] itsString;
char *itsString = new char[10];
Обязательно/желательно ли использовать оператор delete перед повторным веделением?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 22:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно ли освобождать память перед повторым выделением? (C++):

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - C++
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

Нужно ли освобождать память от "sqlite3_column_blob" - C++
Достаю blob данные из SQLite3: int length = sqlite3_column_bytes(stmt,0); char* pData = new char; const char *pBuffer =...

Обязательно ли освобождать память? - C++
Обязательно ли освобождать память, если та область которая выделялась не использовалась в процессе работы программы? Просто, в такой...

Как правильно освобождать память - C++
Подскажите пожалуйста ,где память чистить в таком случае?Или как это правильно сделать. char *funk(.....){ char *name = new...

Как правильно освобождать память в динамических структурах - C++
Использую деструктор для освобождения памяти от указателя на начало списка. struct Node { int x; Node *Next; }; class...

Как и когда правильно освобождать динамически выделенную память? - C++
Доброго времени суток! Задалась вопросом, заданным в заголовке темы "Как и когда правильно освобождать динамически выделенную...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 22:06 #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
Обязательно/желательно ли использовать оператор delete перед повторным веделением?
Обязательно!
Вот тут сжираются 10000 байт памяти, почитай про "утечки памяти" (memory leaks)
C++
1
2
3
char *itsString = new char[10000];
// delete [] itsString;
char *itsString = new char[10];
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
23.02.2013, 22:10 #3
Цитата Сообщение от xtorne21st Посмотреть сообщение
char *itsString = new char[1];
delete [] itsString;
char *itsString = new char[10];
C++
1
2
3
char *itsString = new char[1];
delete [] itsString;
itsString = new char[10];
так правильней
1
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 22:12 #4
xtorne21st, кстати, техника освобождения перед повторным выделением памяти чаще всего находит свое ярчайшее отражение в перегрузке операторов присваивания для классов, которые содержат указатели на данные.

Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
так правильней
и то верно
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 22:32  [ТС] #5
Цитата Сообщение от ITcrusader Посмотреть сообщение
Обязательно!
Вот тут сжираются 10000 байт памяти, почитай про "утечки памяти" (memory leaks)
Странно, в учебнике, просто перевыделяется память без delete. Мне тоже казалось что правильней освобождать память...

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 32 // Basic constructor creats a null string 
 33 String::String() 
 34 { 
 35     itsString = new char[1]; 
 36     itsString[0] = '\0'; 
 37     itsLen = 0; 
 38 } 
 39  
 40 // Private (helper) constructor used only class medhods  
 41 // for creating lines required size and filled it '\0' symb. 
 42 String::String(unsigned short len) 
 43 { 
 44     itsString = new char[len+1]; 
 45     for (unsigned short i = 0; i <= len; ++i) 
 46         itsString[i] = '\0'; 
 47     itsLen = len; 
 48 }
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 22:38 #6
xtorne21st, если вопрос был по данному примеру, то тут все корректно. Память не перевыделяется.

Поясняю:
Здесь определяются конструкторы. Для каждого создаваемого объекта конструктор вызывается единожды (если нет делегации конструкторов, но это уже вопрос отдельный). Все зависит от того, как ты создашь объект, в данном случае, передашь ли целочисленный аргумент конструктору. Если да - вызов второго. Если нет - первого.
1
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,845
23.02.2013, 22:56 #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Обязательно/желательно ли использовать оператор delete перед повторным веделением?
нетесли Вас не интересует результат

C++
1
2
3
char *itsString = new char[1];
//delete [] itsString;
itsString = new char[10];
в первой строчке память выделилась itsString указывает на неё
во второй (закометируемой) она не удаляется
в третьей выделилась новая память и itsString уже указывает на неё,
а то что было выделено в первой строчке память осталась а указатель на неё мы потеряли, и она будет висеть до конца работы программы
вот самая распространенная ошибка
C++
1
2
for(int i=0;i<100;i++)
   char* ch=new char[100];
после выполнения цикла ch будет указывать на сотый блок памяти а 99 потеряются, хотя память выделена и висит, но достучатся до неё мы не можем

по правильному ch и на сотый то не указывает, переменная объявлена в теле цикла и за пределами его теряется
1
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.02.2013, 23:08 #8
Цитата Сообщение от ITcrusader Посмотреть сообщение
xtorne21st, если вопрос был по данному примеру, то тут все корректно. Память не перевыделяется.
Но в деструкторе нужно прописать освобождение памяти.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 23:21  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Но в деструкторе нужно прописать освобождение памяти.
Да это понятно . Просто немножко тупанул с классами: бывает
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 23:21
Привет! Вот еще темы с ответами:

Нужно перевести из С++ в C строку с выделением памяти в куче - C++
Есть функция, для определения...что ли длинны записанного в файле. int length() { int len=0; Node tmp; ...

Выделить память перед strcat - C++
перед выполнением функции strcat() необходимо убедиться, что для переменной выделена память ну или выделено ли достаточно памяти,...

Нужно ли освобождать память после Socket.SendStream? - Delphi
mm:=TMemoryStream.Create; mm.LoadFromFile(mess); Socket.SendStream(mm); После этих манипуляций нужно освободить...

.NET 4.x Нужно при смене изображения, освобождать память предыдущей картинки - C# WPF
Профилировать не удается, занятая под изображение память показывает как unmanaged - и больше ничего не могу из этого вытянуть(использую...


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

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

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