Різниця між звисаючим покажчиком та витоком пам’яті


79

Я не розумію різниці між звисаючим покажчиком та витоком пам’яті. Як пов’язані ці два терміни?

Відповіді:


144

А покажчик обірваних вказує на пам'ять, вже звільнені. Сховище більше не виділяється. Спроба отримати до нього доступ може спричинити помилку сегментації.

Поширений спосіб отримати закінчений покажчик:

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

Іншим поширеним прикладом звисаючих покажчиків є доступ до місця пам'яті за допомогою покажчика, після того, як у цій пам'яті було явно викликано free .


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

Char-ptr ch - це локальна змінна, яка виходить за межі обсягу в кінці функції, витікаючи динамічно виділених 10 байт .


Ця стаття може бути корисною stackoverflow.com/questions/127386 / ...
bkausbk

22

Ви можете сприймати їх як протилежності одне одному.

Коли ви звільняєте область пам'яті, але все одно тримаєте вказівник на неї, цей вказівник бовтається:

Коли ви втрачаєте вказівник, але зберігаєте виділену пам'ять, у вас витік пам'яті:


16

Обірваний покажчик є той , який має значення (НЕ NULL) , яка відноситься до деякої пам'яті , яка не є дійсною для типу об'єкта , який ви очікуєте. Наприклад, якщо ви встановите вказівник на об'єкт, а потім перезапишете цю пам'ять чимось іншим, не пов'язаним, або звільните пам'ять, якщо вона була динамічно розподілена.

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

Вони пов’язані тим, що обидві ситуації пов’язані з неправильним керуванням вказівниками, особливо щодо динамічно розподіленої пам’яті. В одній ситуації (звисаючий вказівник) ви, швидше за все, звільнили пам'ять, але спробували потім посилатися на неї; в іншому (витік пам’яті) ви забули повністю звільнити пам’ять!


6

Висячий вказівник

Якщо будь-який вказівник вказує адресу пам'яті будь-якої змінної, але після того, як якась змінна видалена з цього місця пам'яті, тоді як вказівник все ще вказує таке розташування пам'яті. Такий покажчик відомий як звисаючий покажчик, і ця проблема відома як проблема звисання покажчика.

Результат: значення сміття

Примітка: У деяких компіляторах ви можете отримати попереджувальне повідомлення, що повертає адресу локальної змінної або тимчасової

Пояснення: змінна x - це локальна змінна. Його обсяг і час життя знаходяться в межах виклику функції, отже, після повернення адреси змінної x х стало мертвим, а покажчик все ще вказує, ptr все ще вказує на це місце.

Рішення цієї проблеми: Зробіть змінну x статичною змінною. Іншими словами, ми можемо сказати покажчик, об'єкт вказівника якого був видалений, називається покажчиком.

Витік пам'яті

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


3

Покажчик допомагає створити визначену користувачем область для змінної, яка називається динамічною змінною. Динамічна змінна може бути однією змінною або групою змінних одного типу ( array) або групою змінних різних типів ( struct). Локальна змінна область за замовчуванням починається, коли контроль входить у функцію, і закінчується, коли контроль виходить з цієї функції. Глобальна вакуумна область за замовчуванням починається з виконання програми і закінчується після завершення програми.

Але область дії динамічної змінної, яка утримується покажчиком, може починатися і закінчуватися в будь-який момент виконання програми, що повинен вирішити програміст. Вивішування та витік пам'яті виявляються лише тоді, коли програміст не обробляє кінець області.

Витік пам'яті відбуватиметься, якщо програміст не напише код ( freeпокажчика) для кінця області для динамічних змінних. Будь-який спосіб, як тільки програма вийде з повної пам’яті процесу, буде звільнений, в той час ця звільнена пам’ять також звільниться. Але це спричинить дуже серйозні проблеми для процесу, який триває тривалий час.

Як тільки область дії динамічної змінної закінчується (звільняється), її NULLслід призначити змінній покажчика. В іншому випадку, якщо код помилково звернеться до своєї невизначеної поведінки, це станеться. Отже, звисаючий вказівник - це не що інше, як вказівник, який вказує на динамічну змінну, область дії якої вже закінчена.


3

Витік пам'яті : коли в купі є область пам'яті, але в стеці немає змінної, що вказує на цю пам’ять.

Висячий покажчик : коли змінна покажчика у стеку, але в купі немає пам'яті.

Висячий вказівник, який намагається здійснити розмежування без виділення місця, призведе до помилки сегментації.


3
ваш приклад для звисаючого вказівника насправді не є звисаючим вказівником, а покажчиком NULL. Правильним прикладом було б динамічно призначати пам'ять покажчику, скажімо, використовуючи malloc (), а потім звільняти () цю пам'ять, це робить її звисаючим покажчиком. ПРИМІТКА: після звільнення ми не присвоїли йому значення NULL, таким чином покажчик все ще вказує на ту саму адресу пам'яті, що робить його звисаючим покажчиком. Тепер, якщо ви спробуєте отримати доступ до цієї пам’яті, використовуючи той самий вказівник (тобто розмежування покажчика), ви можете закінчити отримання помилки сегментації.
sactiw

0

Покажчик, що вказує на місце пам'яті, яке було видалено (або звільнено), називається покажчиком.

для отримання додаткової інформації натисніть ТУТ


0

Покажчик, що вказує на місце пам'яті, яке було видалено (або звільнено), називається покажчиком. Існує три різні способи, коли покажчик діє як звисаючий покажчик.

  1. Де-розподіл пам'яті
  2. Виклик функції
  3. Змінна виходить за рамки

—— з https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.