آزاد سازی shared_ptr در یک نقطه - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

آزاد سازی shared_ptr در یک نقطه

0 امتیاز
در کد زیر من نمونه a , b را به کلاس C پاس می دم سپس در مین برنامه نمونه a را آزاد می کنم ولی هنوز a در کلاس C وجود داره و آزاد نشده و نمی خوام برم دستی تو کلاس C آزادش کنم راه دیگری سراغ دارید؟
 
#include <vector>
using namespace std;

class Base{
public:
using Ptr = std::shared_ptr<Base>;
};
class A:public Base{
public:
using Ptr = std::shared_ptr<A>;
};
class B:public Base{
public:
using Ptr = std::shared_ptr<B>;
};
class C{
public:
using Ptr = std::shared_ptr<C>;


void add_object(std::shared_ptr<Base> object){
    objects_.push_back(object);
}
std::vector<std::shared_ptr<Base>> objects_ ;
};
int main()
{

auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
auto c = std::make_shared<C>();

c->add_object(a);
c->add_object(b);

a.reset();

for (auto& obj : c->objects_)
cout << obj << endl;


return 0;
}

 

 

سوال شده خرداد 3, 1402  بوسیله ی Lori3 (امتیاز 857)   11 36 105

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

برای دستیابی به آنچه می خواهید، می توانید به جای shared_ptr در بردار objects_ کلاس C از یک weak_ptr استفاده کنید. به این ترتیب، اشیاء توسط کلاس C زنده نمی مانند و می توانید قبل از استفاده بررسی کنید که آیا شی هنوز زنده است یا خیر. آی تی. در اینجا یک نسخه رفکتور شده از کد شما :

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class Base {
public:
    using Ptr = std::shared_ptr<Base>;
};

class A : public Base {
public:
    using Ptr = std::shared_ptr<A>;
};

class B : public Base {
public:
    using Ptr = std::shared_ptr<B>;
};

class C {
public:
    using Ptr = std::shared_ptr<C>;

    void add_object(std::shared_ptr<Base> object) {
        objects_.push_back(object);
    }
    std::vector<std::weak_ptr<Base>> objects_;
};

int main() {
    auto a = std::make_shared<A>();
    auto b = std::make_shared<B>();
    auto c = std::make_shared<C>();

    c->add_object(a);
    c->add_object(b);

    a.reset();

    for (auto& weak_obj : c->objects_) {
        auto obj = weak_obj.lock();
        if (obj) {
            cout << obj << endl;
        } else {
            cout << "Object has been released" << endl;
        }
    }

    return 0;
}

هنگامی که a را ازاد می کنید، weak_ptr در کلاس C آن را زنده نگه نمی دارد. خروجی این کد نشان می دهد که شی اول آزاد شده است و شی دوم هنوز در دسترس است.

پاسخ داده شده خرداد 3, 1402 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد شهریور 8, 1402 بوسیله ی مصطفی ساتکی
...