Зачем освобождать память через delete?
От: gde11  
Дата: 11.02.04 20:11
Оценка:
Вот программа:

class Cls{
...//Переменные и методы класса.
};
int main(){
   Cls *p = new Cls;
   //что-то делаем с p.
   delete p; // Вот это зачем?
}

Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?
Re: Зачем освобождать память через delete?
От: Par-zzz  
Дата: 11.02.04 20:17
Оценка:
Здравствуйте, gde11, Вы писали:

G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?


Не освобождай, в релиз версии скорее всего ничего страшного не произойдет. Но раз забьешь, два забьешь, а потом это в привычку войдет и польються memleak'и рекой.

Удачи!
/**
* у человека столько проблем, сколько он их себе создает
*/
Re: Зачем освобождать память через delete?
От: VNG Беларусь https://organicmaps.app/
Дата: 11.02.04 20:30
Оценка: 9 (1)
Здравствуйте, gde11, Вы писали:

G>Вот программа:


G>
G>class Cls{
G>...//Переменные и методы класса.
G>};
G>int main(){
G>   Cls *p = new Cls;
G>   //что-то делаем с p.
G>   delete p; // Вот это зачем?
G>}
G>

G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?

Во-первых, эта строка:
delete p;

не только освобождает память, но и вызывает деструктор класса Cls. Если он не тривиален (выполняет какие-нибудь
важные вещи типа освобождения дескрипторов ОС или закрытия файлов), то можно получить грабли.

А во-вторых, насчет освобождения памяти перед завершением программы — это филосовский вопрос. По-моему аллокатор
по умолчанию в SGI STL не освобождает память при работе с контейнерами.

не освобождает
Re[2]: Зачем освобождать память через delete?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 11.02.04 21:06
Оценка: 1 (1)
Par-zzz wrote:

> Не освобождай, в релиз версии скорее всего ничего страшного не произойдет.

> Но раз забьешь, два забьешь, а потом это в привычку войдет и польються
> memleak'и рекой.
Жаль windows при закрытии процесса не пишет в лог о ликах. Быстро бы надоело
его вычищать. Заодно SGI STL allocator поправили бы
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re: Зачем освобождать память через delete?
От: Шахтер Интернет  
Дата: 12.02.04 03:01
Оценка:
Здравствуйте, gde11, Вы писали:

G>Вот программа:


G>
G>class Cls{
G>...//Переменные и методы класса.
G>};
G>int main(){
G>   Cls *p = new Cls;
G>   //что-то делаем с p.
G>   delete p; // Вот это зачем?
G>}
G>

G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?

Можно положится на систему (если это хорошая система, конечно). В некоторых случаях так и делают, никакого криминала здесь нет. Однако полезно выработать привычку убирать за собой.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Зачем освобождать память через delete?
От: Vamp Россия  
Дата: 12.02.04 08:46
Оценка:
G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить
все память, выделяемую программе. Или я что-то не понимаю?
Все дело в волшебных деструкторах. Без delete система память освободит, а деструктор не вызовет. Что, естественно, рушит многие технологии современного С++ программирования, типа RAII.
Да здравствует мыло душистое и веревка пушистая.
Re: Зачем освобождать память через delete?
От: bkat  
Дата: 12.02.04 09:33
Оценка:
Здравствуйте, gde11, Вы писали:

G>Вот программа:


G>
G>class Cls{
G>...//Переменные и методы класса.
G>};
G>int main(){
G>   Cls *p = new Cls;
G>   //что-то делаем с p.
G>   delete p; // Вот это зачем?
G>}
G>

G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?

Много причин.
Например, потому что так проще...
Зачем тебе в твой код дополнительная инфа о том,
что некий код используется прямо перед завершением работы и именно этот конкретный объект
можно и не удалять. А что если ты захочешь этот код использовать еще где и уже не
перед самых выходом из программы?
В целом проще следовать одной проверенной стратегии (выделил/попользовал/удалил),
чем несколькими:
— выделил/попользовал/удалил;
— выделил/попользовал/не удалил, потому что программа скоро завершится
— выделил/попользовал/не удалил, потому что памяти еще много...
Re: Зачем освобождать память через delete?
От: semishin1  
Дата: 12.02.04 09:52
Оценка: -3
Здравствуйте, gde11, Вы писали:

G>Вот программа:


G>
G>class Cls{
G>...//Переменные и методы класса.
G>};
G>int main(){
G>   Cls *p = new Cls;
G>   //что-то делаем с p.
G>   delete p; // Вот это зачем?
G>}
G>

G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?

В таком слуае как этот и если говорить о Windows освобождать динамически участки памяти не обязательно. Операционная система сделает это сама, когда будет в систему возращать ресурсы.
... << RSDN@Home 1.1.2 stable >>
Re[2]: Зачем освобождать память через delete?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 12.02.04 11:12
Оценка:
Vamp wrote:

> Без delete система память освободит, а деструктор не вызовет.

Самое поразительное, что и при вызове delete может не вызваться деструктор!
Например:
#include <memory>
struct Pimpl; // определение в cpp файле

struct P
{
    std::auto_ptr<Pimpl> m_pimpl;
    ~P() {}
};


Кто не знает ответ, срочно в книжный магазин за хорошими книжками!

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[3]: Зачем освобождать память через delete?
От: Lorenzo_LAMAS  
Дата: 12.02.04 11:19
Оценка:
A>Кто не знает ответ, срочно в книжный магазин за хорошими книжками!

Какой ответ?
Программа содержит неопределенное поведение.
Of course, the code must be complete enough to compile and link.
Re[3]: Зачем освобождать память через delete?
От: Vamp Россия  
Дата: 12.02.04 11:22
Оценка:
A>Самое поразительное, что и при вызове delete может не вызваться деструктор!
A>
A>#include <memory>
A>struct Pimpl; // определение в cpp файле

A>struct P
A>{
A>    std::auto_ptr<Pimpl> m_pimpl;
A>    ~P() {}
A>};
A>

Это о чем пример? Он вообще не должен компилироваться...
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Зачем освобождать память через delete?
От: LaptevVV Россия  
Дата: 12.02.04 11:24
Оценка:
Здравствуйте, alnsn, Вы писали:

A>Vamp wrote:


>> Без delete система память освободит, а деструктор не вызовет.

A>Самое поразительное, что и при вызове delete может не вызваться деструктор!
A>Например:
A>
A>#include <memory>
A>struct Pimpl; // определение в cpp файле

A>struct P
A>{
A>    std::auto_ptr<Pimpl> m_pimpl;
A>    ~P() {}
A>};
A>


A>Кто не знает ответ, срочно в книжный магазин за хорошими книжками!


А какие, по вашему, хорошие?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Зачем освобождать память через delete?
От: Lorenzo_LAMAS  
Дата: 12.02.04 11:28
Оценка:
struct Pimpl;

void g()
{
   Pimpl * p = 0;
   delete p;
}


"ComeauTest.c", line 6: warning: delete of pointer to incomplete class
delete p;
^

Of course, the code must be complete enough to compile and link.
Re[5]: Зачем освобождать память через delete?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 12.02.04 11:36
Оценка:
Lorenzo_LAMAS wrote:

> "ComeauTest.c", line 6: warning: delete of pointer to incomplete class

> delete p;
> ^
Хороший компилятор поможет отложить покупку хороших книг
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[4]: Зачем освобождать память через delete?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 12.02.04 11:41
Оценка:
LaptevVV wrote:

> А какие, по вашему, хорошие?

Я честно говоря, хотел точную ссылку на книгу дать, но подзабыл, где это
было. Поэтому выразился абстрактно. Общий шаблон предположительно такой:
[More] (effective|exceptional) C++
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[6]: Зачем освобождать память через delete?
От: Lorenzo_LAMAS  
Дата: 12.02.04 11:59
Оценка:
A>Хороший компилятор поможет отложить покупку хороших книг
А хороший ISO/IEC 14882 поможет отказаться от многих книг вообще.
Of course, the code must be complete enough to compile and link.
Re[5]: Зачем освобождать память через delete?
От: Vamp Россия  
Дата: 12.02.04 12:02
Оценка:
А g++ вообще отказался. Сказал, что еррор.
В любом случае, я так и не понял, о чем этот пример.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Зачем освобождать память через delete?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 12.02.04 12:23
Оценка:
Vamp wrote:

> А g++ вообще отказался. Сказал, что еррор.

> В любом случае, я так и не понял, о чем этот пример.
http://www.boost.org/libs/utility/checked_delete.html
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[7]: Зачем освобождать память через delete?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 12.02.04 13:59
Оценка:
Lorenzo_LAMAS wrote:

> А хороший ISO/IEC 14882 поможет отказаться от многих книг вообще.

По-хорошему, еще нужен список исправленных ошибок
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re: Зачем освобождать память через delete?
От: _Stas Украина  
Дата: 12.02.04 20:51
Оценка:
Здравствуйте, gde11, Вы писали:

G>Вот программа:


G>
G>class Cls{
G>...//Переменные и методы класса.
G>};
G>int main(){
G>   Cls *p = new Cls;
G>   //что-то делаем с p.
G>   delete p; // Вот это зачем?
G>}
G>

G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?

Вот именно — вроде должна освободить память. А кто сказал, что это правда? Лучше delete пару раз где надо поставить.
Real programmers never use wizards!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.