logo

Що таке витік пам'яті? Як ми можемо уникнути?

Витік пам’яті відбувається, коли програмісти створюють пам’ять у купі та забувають її видалити.

Наслідком витоку пам’яті є зниження продуктивності комп’ютера через зменшення обсягу доступної пам’яті. Згодом, у гіршому випадку, може бути виділено забагато доступної пам’яті, вся або частина системи або пристрою перестає працювати належним чином, програма виходить з ладу або система значно сповільнюється.



Витоки пам’яті є особливо серйозними проблемами для таких програм, як демони та сервери, які за визначенням ніколи не завершують роботу.

Приклад витоку пам'яті

Наведений нижче приклад демонструє концепцію витоку пам’яті.

об'єкт для json у java

C








/* Function with memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Return without freeing ptr*/> >return>;> }>

>

>

Причини витоку пам'яті в C

  1. Коли динамічно виділена пам’ять не звільняється викликом free, це призводить до витоку пам’яті. Завжди переконайтеся, що для кожного динамічного виділення пам’яті за допомогою malloc або calloc існує відповідний вільний виклик.
  2. Коли втрачається відстеження покажчиків, які посилаються на виділену пам’ять, пам’ять може не звільнятися. Тому слідкуйте за всіма покажчиками та переконайтесь, що пам’ять звільнено.
  3. Коли програма раптово завершується, а виділена пам’ять не звільняється, або якщо будь-яка частина коду перешкоджає виклику free, може статися витік пам’яті.

Як уникнути витоку пам'яті?

Щоб уникнути витоку пам’яті, пам’ять, виділену в купі, завжди слід звільняти, коли вона більше не потрібна.

Приклад: програма для звільнення пам’яті, виділеної в купі, щоб уникнути витоку пам’яті

Наведена нижче програма показує, що пам’ять, виділену в купі, звільняється, щоб уникнути витоку пам’яті.

C




/* Function without memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Memory allocated by malloc is released */> >free>(ptr);> >return>;> }>

>

>

Приклад: програма для перевірки, чи звільнено пам'ять

Наведений нижче приклад демонструє, як перевірити, чи звільнено пам’ять, виділену в купі, чи ні.

C




// C Program to check whether the memory is> // freed or not> #include> #include> int> main(>void>)> {> >int>* ptr;> >ptr = (>int>*)>malloc>(>sizeof>(>int>));> >if> (ptr == NULL)> >printf>(>'Memory Is Insuffficient '>);> >else> {> >free>(ptr);> >printf>(>'Memory Freed '>);> >}> }> // This code is contributed by sarajadhav12052009>

>

>

Вихід

Memory Freed>

Висновок

Підсумовуючи, витоки пам’яті можуть виникнути, коли ми виділяємо пам’ять у купі, але забуваємо її звільнити або звільнити. Через витік пам’яті ми можемо зіткнутися з погіршенням продуктивності та системою стати нестабільною. Витоки пам'яті завдають більше шкоди програмам, що працюють довго, наприклад серверам. Щоб уникнути витоку пам’яті, ми повинні звільнити динамічно виділену пам’ять, викликавши такі функції, як free().