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

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

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

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

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

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

Нужно ли освобождать память от "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++
Доброго времени суток! Задалась вопросом, заданным в заголовке темы "Как и когда правильно освобождать динамически выделенную...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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];
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 22:12     Нужно ли освобождать память перед повторым выделением? #4
xtorne21st, кстати, техника освобождения перед повторным выделением памяти чаще всего находит свое ярчайшее отражение в перегрузке операторов присваивания для классов, которые содержат указатели на данные.

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

Поясняю:
Здесь определяются конструкторы. Для каждого создаваемого объекта конструктор вызывается единожды (если нет делегации конструкторов, но это уже вопрос отдельный). Все зависит от того, как ты создашь объект, в данном случае, передашь ли целочисленный аргумент конструктору. Если да - вызов второго. Если нет - первого.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,729
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
5416 / 4812 / 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     Нужно ли освобождать память перед повторым выделением?
Еще ссылки по теме:

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

Что нужно изучить в c++, перед изучением ООП - C++
Перечислите темы, которые я должен знать, перед изучением ООП, просто не знаю готов ли я, все ли я выучил)

Нужно чтобы принимал минус перед нулем - C++
Если ввести -00043 то работает, а вот если -000000000000000000000000000005353 то нет, потому что берет минус и первые 16 нолей и пишет что...

Нужно выделить память в куче - C++
Работаю с довольно большим объемом данных, записанных матрицей. Для этого нужно выделить память в куче. правильно ли я это делаю: int...


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

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

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