class Cls{
...//Переменные и методы класса.
};
int main(){
Cls *p = new Cls;
//что-то делаем с p.delete p; // Вот это зачем?
}
Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?
Здравствуйте, gde11, Вы писали:
G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?
Не освобождай, в релиз версии скорее всего ничего страшного не произойдет. Но раз забьешь, два забьешь, а потом это в привычку войдет и польються memleak'и рекой.
Удачи!
/**
* у человека столько проблем, сколько он их себе создает
*/
Здравствуйте, 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 не освобождает память при работе с контейнерами.
Par-zzz wrote:
> Не освобождай, в релиз версии скорее всего ничего страшного не произойдет. > Но раз забьешь, два забьешь, а потом это в привычку войдет и польються > memleak'и рекой.
Жаль windows при закрытии процесса не пишет в лог о ликах. Быстро бы надоело
его вычищать. Заодно SGI STL allocator поправили бы
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Здравствуйте, 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 вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?
Можно положится на систему (если это хорошая система, конечно). В некоторых случаях так и делают, никакого криминала здесь нет. Однако полезно выработать привычку убирать за собой.
G>Я понимаю, что память надо освождать если она выделяется в цикле много раз и т. п. А надо ли это делать в приведенном примере? Ведь программа заканчивается и Windows вроде должна освободить
все память, выделяемую программе. Или я что-то не понимаю?
Все дело в волшебных деструкторах. Без delete система память освободит, а деструктор не вызовет. Что, естественно, рушит многие технологии современного С++ программирования, типа RAII.
Здравствуйте, 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 вроде должна освободить все память, выделяемую программе. Или я что-то не понимаю?
Много причин.
Например, потому что так проще...
Зачем тебе в твой код дополнительная инфа о том,
что некий код используется прямо перед завершением работы и именно этот конкретный объект
можно и не удалять. А что если ты захочешь этот код использовать еще где и уже не
перед самых выходом из программы?
В целом проще следовать одной проверенной стратегии (выделил/попользовал/удалил),
чем несколькими:
— выделил/попользовал/удалил;
— выделил/попользовал/не удалил, потому что программа скоро завершится
— выделил/попользовал/не удалил, потому что памяти еще много...
Здравствуйте, 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 освобождать динамически участки памяти не обязательно. Операционная система сделает это сама, когда будет в систему возращать ресурсы.
Vamp wrote:
> Без delete система память освободит, а деструктор не вызовет.
Самое поразительное, что и при вызове delete может не вызваться деструктор!
Например:
#include <memory>
struct Pimpl; // определение в cpp файлеstruct P
{
std::auto_ptr<Pimpl> m_pimpl;
~P() {}
};
Кто не знает ответ, срочно в книжный магазин за хорошими книжками!
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Здравствуйте, 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>Кто не знает ответ, срочно в книжный магазин за хорошими книжками!
А какие, по вашему, хорошие?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Lorenzo_LAMAS wrote:
> "ComeauTest.c", line 6: warning: delete of pointer to incomplete class > delete p; > ^
Хороший компилятор поможет отложить покупку хороших книг
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
LaptevVV wrote:
> А какие, по вашему, хорошие?
Я честно говоря, хотел точную ссылку на книгу дать, но подзабыл, где это
было. Поэтому выразился абстрактно. Общий шаблон предположительно такой:
[More] (effective|exceptional) C++
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Vamp wrote:
> А g++ вообще отказался. Сказал, что еррор. > В любом случае, я так и не понял, о чем этот пример. http://www.boost.org/libs/utility/checked_delete.html
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Lorenzo_LAMAS wrote:
> А хороший ISO/IEC 14882 поможет отказаться от многих книг вообще.
По-хорошему, еще нужен список исправленных ошибок
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Здравствуйте, 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 пару раз где надо поставить.