kzhereb / knu-is-ooop2019

Materials for "Fundamentals of OOP" course
MIT License
3 stars 0 forks source link

T10.29. Як видаляти об’єкти у випадку циклічної залежності? #29

Open WAG13 opened 4 years ago

yanaskyrda commented 4 years ago

Можна використовувати std::weak_ptr. Вказівник weak_ptr перевіряє чи є інші "власники" об'єкту, але сам "власником" не є і якщо він не знаходить інших вказівників на об'єкт, то об'єкт видаляється.

class A {
    std::string data;
    std::weak_ptr<A> connected;
public:
    friend void connect (std::shared_ptr<A> &first, std::shared_ptr<A> &second);
}

void connect (std::shared_ptr<A> &first, std::shared_ptr<A> &second) {
        first->connected = second;
        second->connected = first;
}

int main() {
    auto first = std::make_shared<A>();
    auto second = std::make_shared<A>();
    connect(first, second);
    return 0;
}

В кінці буде видалено обидва класи.

RostyslavMV commented 4 years ago

На С++ в складних випадках залежності класів один від одного краще використовувати weak_ptr, як і в загальному при складних випадках роботи з пам'яттю краще використовувати різни види smart pointers

ilyakorenevskyi commented 4 years ago

Для таких випадків можна використовувати weak_ptr, або інші smart pointer наприклад shared ptr. Вони визначають кількість користувачів покажчика