Cтраница 1
Утечка памяти - это трудно выявляемый дефект, который словно чума поражает многие большие системы. Хотя освобождение памяти, занятой некоторым объектом, обычно является делом, в принципе, простым, на практике очень тяжело быть уверенным в том, что удалось отыскать все вплоть до последней распределенной области памяти. Механизм деструкторов в языке C полезен, однако система не может гарантировать, что обход структур данных совершен так, как задумывалось. Когда объект прекращает свое существование, его указатели теряются безвозвратно, и любой указатель, оставленный без внимания деструктором, потенциально ведет к утечке памяти. [1]
Напишите программу, которая приводит к утечке памяти. [2]
Многие системы страдают подобными заболеваниями в форме утечки памяти. [3]
При невнимательной работе с указателями может возникнуть эффект так называемой утечки памяти. Это происходит, если указателю присваивается новое значение, а память, на которую он ссылался, не освобождается. Ниже показан пример такой ситуации. [4]
В ходе выполнения перегруженных операций и создаются новые полиномы, поэтому данная реализация связана с утечкой памяти. Утечку памяти можно легко ликвидировать, добавляя в реализацию конструктор копирования, перегруженную операцию присваивания и деструктор. [5]
Все объекты, созданные с помощью new, должны иметь соответствующий delete, иначе программа вызовет утечку памяти. Однако в некоторых случаях за уничтожение объектов отвечают объекты-предки. Таким образом, вопрос состоит не в том, нужно ли уничтожать объект, а в том, кто должен это делать. [6]
В языке C существуют специальные механизмы, упрощающие создание классов, имеющих корректную семантику копирования и предотвращающих утечку памяти. [7]
Онн работают так, как это опнсатю для класса Complex, однако ведут к неверной семантике копирования к утечке памяти, если какие-нибудь данные-члены являются указателями. [8]
Они работают так, как это описано для класса Complex, однако ведут к неверной семантике копирования и утечке памяти, если какие-нибудь данные-члены являются указателями. Программа 4.21 - суть интерфейс очереди FIFO, в который включены три перечисленных функции. Подобно конструкторам, они имеют отличительные сигнатуры, в которые входит имя класса. [9]
В то же время другие считают, что исключения предоставляют эффективный способ возврата сквозь несколько уровней вызовов функций, не подвергаясь при этом опасности утечки памяти. Чаще всего приводится следующий пример. Часть кода, которая перехватывает этот запрос, должна вызвать функцию-член менеджера диалоговых окон, которая, в свою очередь, вызывает код, обрабатывающий этот запрос. Этот код вызывает другой код, который решает, какое диалоговое окно использовать, и, в свою очередь, вызывает код, чтобы отобразить на экране это диалоговое окно. И теперь уже этот код наконец-то вызывает другой код, который обрабатывает данные, вводимые пользователем. Если пользователь щелкнет на кнопке Cancel ( Отменить), код должен возвратиться к самому первому вызывающему методу, где обрабатывался первоначальный запрос. [10]
Как уже упоминалось в разделе 4.8, мы не рассматривали вопросов распределения памяти при реализации операции объединить в программе 9.16. В силу этой причины при выполнении операции имеет место утечка памяти, так что в некоторых ситуациях она становится непригодной. [11]
Чтобы решить, насколько правомочно такое использование исключений, попытайтесь ответить на следующие вопросы: станет ли в результате программа проще или, наоборот, труднее для понимания; действительно ли уменьшится риск возникновения ошибок и утечки памяти; труднее или проще теперь станет поддержка такой программы. Безусловно, объективно ответить на эти вопросы сложно: многое зависит от привычек и субъективных взглядов программиста, из-за чего, кстати, и возникают споры вокруг этих вопросов. [12]
В ходе выполнения перегруженных операций и создаются новые полиномы, поэтому данная реализация связана с утечкой памяти. Утечку памяти можно легко ликвидировать, добавляя в реализацию конструктор копирования, перегруженную операцию присваивания и деструктор. [13]
Куда деваются при удалении массива все эти объекты класса CAT, показанные в предыдущем разделе. Не происходит ли здесь утечка памяти. Удаление массива Family с помощью оператора dolete [ ] ( не забудьте установить квадратные скобки) освобождает все ячейки памяти, отведенные для него. Компилятор достаточно сообразительный, чтобы удалить из памяти все объекты удаляемого массива и освободить динамическую память для нового использования. [14]
Это не АТД первого класса: клиентские программы должны знать, чта всзможиа утечка памяти, з иантика копирования заключается е копировании указателей4 ( см. упр. [15]