Sobes.tech
Senior

Чӣ гуна нишондиҳандаи оқилонаро барои як ё чанд объект амалӣ кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Барои як объект: unique_ptr ё shared_ptr. Барои чанд объект: shared_ptr (мулоқотӣ) ё weak_ptr (назорат кардан бе иштироки дар идоракунии ҳаёти объект).

#include <memory>
#include <vector>

// Намунаи синфи объект
class MyObject {
public:
    MyObject() { /* Конструктор */ }
    ~MyObject() { /* Деструктор */ }
};

// Барои як объект: unique_ptr (ҳаммудонӣ)
void single_unique_ptr() {
    std::unique_ptr<MyObject> ptr = std::make_unique<MyObject>();
    // Объект автоматӣ тоза мешавад вақте ки аз доираи назар мерасад
}

// Барои як объект: shared_ptr (мулоқотӣ)
void single_shared_ptr() {
    std::shared_ptr<MyObject> ptr = std::make_shared<MyObject>();
    // Шумораи соҳибон меафзояд
    std::shared_ptr<MyObject> another_ptr = ptr;
    // Объект вақте тоза мешавад, ки охирин shared_ptr ба он тамос гирад
}

// Барои чанд объект: вектор бо shared_ptr
void multiple_shared_ptr() {
    std::vector<std::shared_ptr<MyObject>> objects;
    objects.push_back(std::make_shared<MyObject>());
    objects.push_back(std::make_shared<MyObject>());
    // Ҳар як объект бо shared_ptr-и худ дар вектор идора мешавад
    // Объектҳо пас аз тоза кардани shared_ptr-ҳо тоза мешаванд
}

// Барои чанд объект: вектор бо unique_ptr
void multiple_unique_ptr() {
    std::vector<std::unique_ptr<MyObject>> objects;
    objects.push_back(std::make_unique<MyObject>());
    objects.push_back(std::make_unique<MyObject>());
    // Дар ин ҳолат, вектор соҳиби нишондиҳандаҳои унитарӣ аст
    // Объектҳо пас аз баромадан аз доираи вектор тоза мешаванд

    // Эзоҳ: unique_ptr наметавонад нусхабардорӣ шавад, танҳо интиқол (move)
    std::unique_ptr<MyObject> moved_ptr = std::move(objects[0]);
}

Мувофиқати unique_ptr ва shared_ptr:

Хусусият std::unique_ptr std::shared_ptr
Власият Ягона Мулоқотӣ (бо ҳисобкунаки ишораҳо)
Нусхабардорӣ Не (фақат интиқол) Бале
Иҷроӣ Каме тезтар (беназоратии ҳисобкунак) Каме сусттар (ҳисобкунаки ишораҳо)
Даврии цикли Мефарқ мекунад Мутобиқати бо проблемаи ҷараёни ёддоштӣ (мехоҳад weak_ptr)

std::weak_ptr барои назорат кардани объекте, ки бо shared_ptr идора мешавад, истифода мешавад, бе афзоиши шумораи ишораҳо, то ки мушкилоти циклиро пешгирӣ кунад.

#include <memory>

class Node {
public:
    std::shared_ptr<Node> next;
    std::weak_ptr<Node> previous; // истифодаи weak_ptr барои пешгирӣ аз цикли ишора

    Node() = default;
    ~Node() { /* Деструктор */ }
};

void weak_ptr_example() {
    std::shared_ptr<Node> node1 = std::make_shared<Node>();
    std::shared_ptr<Node> node2 = std::make_shared<Node>();

    node1->next = node2;
    node2->previous = node1; // истифодаи weak_ptr

    // метавон аз weak_ptr ба shared_ptr барои дастрасӣ ба объект истифода кард
    if (std::shared_ptr<Node> locked_node = node2->previous.lock()) {
        // Агар объект ҳанӯз зинда бошад
        // ... кор бо locked_node
    } else {
        // Объект аллакай тоза шудааст
    }
}