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

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

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 22:03     Нужно ли освобождать память перед повторым выделением? #1
к примеру мы имеем:
C++
1
2
3
char *itsString = new char[1];
delete [] itsString;
char *itsString = new char[10];
Обязательно/желательно ли использовать оператор delete перед повторным веделением?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
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];
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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];
так правильней
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 22:12     Нужно ли освобождать память перед повторым выделением? #4
xtorne21st, кстати, техника освобождения перед повторным выделением памяти чаще всего находит свое ярчайшее отражение в перегрузке операторов присваивания для классов, которые содержат указатели на данные.

Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
так правильней
и то верно
xtorne21st
интересующийся
300 / 271 / 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 }
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 22:38     Нужно ли освобождать память перед повторым выделением? #6
xtorne21st, если вопрос был по данному примеру, то тут все корректно. Память не перевыделяется.

Поясняю:
Здесь определяются конструкторы. Для каждого создаваемого объекта конструктор вызывается единожды (если нет делегации конструкторов, но это уже вопрос отдельный). Все зависит от того, как ты создашь объект, в данном случае, передашь ли целочисленный аргумент конструктору. Если да - вызов второго. Если нет - первого.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
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 и на сотый то не указывает, переменная объявлена в теле цикла и за пределами его теряется
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.02.2013, 23:08     Нужно ли освобождать память перед повторым выделением? #8
Цитата Сообщение от ITcrusader Посмотреть сообщение
xtorne21st, если вопрос был по данному примеру, то тут все корректно. Память не перевыделяется.
Но в деструкторе нужно прописать освобождение памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 23:21     Нужно ли освобождать память перед повторым выделением?
Еще ссылки по теме:

C++ Выделить память перед strcat
C++ Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти
Нужно ли освобождать память от "sqlite3_column_blob" C++

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 23:21  [ТС]     Нужно ли освобождать память перед повторым выделением? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Но в деструкторе нужно прописать освобождение памяти.
Да это понятно . Просто немножко тупанул с классами: бывает
Yandex
Объявления
23.02.2013, 23:21     Нужно ли освобождать память перед повторым выделением?
Ответ Создать тему
Опции темы

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