Middle
როგორ მუშაობს unique_ptr C++-ში?
sobes.tech AI
პასუხი AI-სგან
std::unique_ptr — бул акылдуу көрсөтүүчү, ал динамикалык бөлүнгөн объекттин эксклюзивдүү ээлигин ишке ашырат. Ал автоматтык эс тутумду башкарууну камсыз кылат: 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 жана андан кийинки версияларда колдонулат, эгерде катуу ээлик жана автоматтык бошотуу талап кылынса.