Зміст курсу
Розумні Вказівники C++
Розумні Вказівники C++
Динамічне Виділення Пам'яті
Існує два типи пам'яті, доступні для використання: стек і купа. Пам'ять стека обмежена за розміром і добре підходить для невеликих, короткоживучих змінних, які не потрібні за межами їхньої області видимості. Коли змінна, що зберігається в стеці, виходить за межі області видимості, вона автоматично знищується.
stack_allocated
// Creates an integer variable on the stack int stack_int = 42;
Однак, коли вам потрібна пам'ять, яка зберігається довше, ніж її область видимості, або вимагає більше місця, ви звертаєтеся до купи. Куча - це набагато більший пул пам'яті, де ваша програма може запитувати пам'ять під час виконання. Це зазвичай робиться за допомогою ключового слова new
:
heap_allocated
// create an integer on the heap int* heap_int = new int;
Складність пам'яті в купі полягає в тому, що вона не звільняється автоматично. Це відповідальність розробника - звільнити її, коли вона більше не потрібна. Для кожного new
має бути відповідний delete
.
free_pointer
// Explicitly deletes the integer on the heap delete heap_int;
Витоки пам'яті
Коли ви вводите вказівники у свій код, ви входите в сферу ручного управління пам'яттю. Ручне управління пам'яттю вимагає від вас звільняти пам'ять, коли вона більше не потрібна. Це може призвести до поширених помилок: витоків пам'яті та висячих вказівників.
Витоки пам'яті зазвичай виникають, коли ви забуваєте звільнити пам'ять. Така пам'ять залишається зарезервованою, що призводить до втрати пам'яті вашим програмою з часом.
memory_leak
running = true while (running) { int* p_int = new int; }
Висячі вказівники
Висячі вказівники виникають коли вказівник продовжує вказувати на пам'ять, яка вже була звільнена. Це як мати карту скарбів, яка веде вас до місця (адреса пам'яті), де скарб (дані) вже забрано (знищено).
main
#include <iostream> int main() { int* ptr = new int; // dynamically allocate an integer *ptr = 42; // assign a value to the allocated memory std::cout << *ptr << std::endl; // This will output 42 delete ptr; // deallocate the memory std::cout << *ptr << std::endl; // ptr is a dangling pointer! }
Спроба доступу до вказівника після виклику delete
на ньому, який звільняє пам'ять, на яку він вказував. Після видалення вказівник стає висячим вказівником, оскільки він все ще містить адресу пам'яті, яка більше не існує.
Доступ до висячого вказівника може призвести до непередбачуваної поведінки або навіть до збоїв, оскільки пам'ять, на яку він вказує, більше не є дійсною.
Дякуємо за ваш відгук!