برای دستیابی به آنچه می خواهید، می توانید به جای 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 آن را زنده نگه نمی دارد. خروجی این کد نشان می دهد که شی اول آزاد شده است و شی دوم هنوز در دسترس است.