Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Динамічне Виділення Пам'яті | Вступ до Розумних Вказівників
Розумні Вказівники C++
course content

Зміст курсу

Розумні Вказівники C++

Розумні Вказівники C++

1. Вступ до Розумних Вказівників
2. Унікальні Вказівники
3. Спільні Вказівники
4. Слабкі Вказівники
5. Просунуті Теми

book
Динамічне Виділення Пам'яті

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

h

stack_allocated

copy
12
// Creates an integer variable on the stack int stack_int = 42;

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

h

heap_allocated

copy
12
// create an integer on the heap int* heap_int = new int;

Складність пам'яті в купі полягає в тому, що вона не звільняється автоматично. Це відповідальність розробника - звільнити її, коли вона більше не потрібна. Для кожного new має бути відповідний delete.

h

free_pointer

copy
12
// Explicitly deletes the integer on the heap delete heap_int;

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

Коли ви вводите вказівники у свій код, ви входите в сферу ручного управління пам'яттю. Ручне управління пам'яттю вимагає від вас звільняти пам'ять, коли вона більше не потрібна. Це може призвести до поширених помилок: витоків пам'яті та висячих вказівників.

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

h

memory_leak

copy
12345
running = true while (running) { int* p_int = new int; }

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

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

cpp

main

copy
12345678910111213
#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 на ньому, який звільняє пам'ять, на яку він вказував. Після видалення вказівник стає висячим вказівником, оскільки він все ще містить адресу пам'яті, яка більше не існує.

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

question mark

Чи є у наступному коді витік пам'яті?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 2
We're sorry to hear that something went wrong. What happened?
some-alt