Зміст курсу
Розумні Вказівники C++
Розумні Вказівники C++
Передача Унікальних Вказівників
Однією з основних причин, чому ми обираємо вказівники та динамічне виділення пам'яті замість статичних змінних, є гнучкість, яку вони пропонують при передачі даних через різні секції коду. Однак, коли мова йде про унікальні вказівники, передача стає трохи складнішою.
Повернення з функцій-будівельників
Одним з дійсних випадків використання для передачі унікального вказівника є коли ви повертаєтеся з функції-будівельника (функції, яка існує лише для виділення/створення ресурсів).
unique_pointer_builder
#include <iostream> #include <memory> std::unique_ptr<int> unique_ptr_builder() { return std::make_unique<int>(42); } int main() { // This will be the sole owner of the dynamically allocated integer 42 std::unique_ptr<int> p_unique = unique_ptr_builder(); if (p_unique) std::cout << "Value from unique pointer: " << *p_unique << std::endl; else std::cout << "Unique pointer is null." << std::endl; }
Використання функції-білдера для створення унікального вказівника на значення int
. Після повернення функції, unique_ptr
у функції main
починає вказувати на динамічне значення цілого числа.
При передачі права власності
Також вважається правильним і безпечним move
унікального вказівника. Наприклад, ви можете передати право власності на унікальний вказівник з class A
до class B
.
transferring_ownership
// Create a unique pointer inside classA classA->source_ptr = std::make_unique<int>(42); // Later, move the ownership to classB, this is perfectly fine classB->target_ptr = std::move(sourcePtr);
Коли не слід передавати унікальні вказівники
Спільне використання std::unique_ptr
з наміром, щоб його володіли кілька сторін, не є підходящим. Це порушує основну концепцію унікального вказівника, оскільки він повинен мати лише одного власника.
Ви можете створити екземпляр унікального вказівника всередині класу, а потім передати його сирий вказівник до функції зовнішньої бібліотеки. Таке спільне використання є небезпечним і може призвести до важко відлагоджуваних проблем з пам'яттю.
passing_raw_pointer
// Create a unique pointer. std::unique_ptr<std::string> p_unique = std::make_unique<int>(33); // Extract the raw pointer and pass it to an external class. ExternalClass obj(p_unique.get()); // Never do this, not safe.
Дякуємо за ваш відгук!