Middle
unique_ptr дар C++ чӣ гуна кор мекунад?
sobes.tech AI
Ҷавоб аз AI
std::unique_ptr — интуиран ишоратгари аст, ки соҳибияти истисноии объектҳои динамикӣ-таъиншударо амалӣ мекунад. Вай идораи автоматии хотираро таъмин мекунад: объекте, ки ба unique_ptr ишора мекунад, худ ба худ ҳангоми нобуд кардани unique_ptr нест карда мешавад.
Хусусиятҳои асосӣ:
- Иштибоҳии соҳибият: Дар ҳар лаҳза танҳо як
unique_ptrметавонад соҳиби объект бошад. - Нест кардани нусхабардорӣ:
unique_ptrнаметавонад нусхабардорӣ шавад. Ин пешгирӣ мекунад соҳибияти бисёрмавзӯъро ба як объект ва мушкилоти "дукаратаи нест кардан". - Маънои интиқол: Соҳибият ба объект метавонад аз
unique_ptrба дигар тавассути маънои интиқол (std::move) гузарад. - Идораи тозакунанда: Мумкин аст, тозакунандаи худсохт (deleter) барои идораи роҳҳои махсуси озод кардани захираҳо пешниҳод шавад.
Принсипи кор дар асоси RAII (Resource Acquisition Is Initialization): захира (хотираи динамикӣ-тарҳрезишуда) дар вақти эҷоди объект (unique_ptr) ба даст оварда мешавад ва дар вақти нобудӣ озод карда мешавад.
#include <memory> // Барои unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass эҷод шуд\n"; }
~MyClass() { std::cout << "MyClass нест шуд\n"; }
};
int main() {
{
// Эҷоди unique_ptr, ки соҳиби объект MyClass аст
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Дар ин лаҳза, ptr1 соҳиби ягонаи объект аст
// auto ptr2 = ptr1; // Хатогии компилятор: нусхабардорӣ манъ аст
// интиқоли соҳибият аз ptr1 ба ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Пас аз интиқол, ptr1 дигар соҳиби объект нест (ба nullptr табдил ёфт)
if (!ptr1) {
std::cout << "ptr1 соҳиби объект нест: " << (ptr1 ? "Бале" : "Не") << "\n";
}
// Маҳалли тамоюл барои ptr2 ба охир мерасад.
// ptr2 нест карда мешавад ва объект MyClass, ки соҳиби он аст, автоматӣ нест карда мешавад.
} // Объект MyClass дар ин ҷо нест карда мешавад
std::cout << "Охир main.\n";
return 0;
}
Мувофиқати бо raw pointer:
| Хусусият | raw pointer |
std::unique_ptr |
|---|---|---|
| Владеенство дар захира | Нақша накарда шудааст | Иштибоҳӣ |
| Автоматии нест кардан | Не | Бале |
| Маънои нусхабардорӣ | Бале | Не (фақат интиқол) |
| Ҳодисаҳои хотираҳо | Риск баланд | Риск паст |
Ҳамагӣ, unique_ptr роҳи беҳтарини идораи хотираи динамикӣ дар C++11 ва версияҳои баъдӣ барои ҳолатҳое мебошад, ки талаботи қатъии соҳибият ва озодкунии автоматӣ зарур аст.