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 {
// Объект аллакай тоза шудааст
}
}