On Wed, Dec 21, 2011 at 4:54 AM, Igor R <boost.lists@gmail.com> wrote:
And what's wrong with just shared_ptr<B>? Why do you need the additional level of indirection?
For example
int main() { shared_ptr<B> p(new D1); shared_ptr<B> user1 = p; // User1 uses p p.reset(new D2); // p changes pointed type to D2, user1 still points to D1 return 0; }
or
int main() { shared_ptr<B> p(new D1); shared_ptr<B>* user2 = &p; // User2 uses p, but the p.use_count() is still 1. p.reset(new D2); // p changes pointed type to D2, *user2 points to D1 return 0; }
Ok, so you actually want the following: 1) The container itself shouldn't have "strong" references to your objects 2) An object can be recreated/replaced when it doesn't have any strong references. Am I right?
If so, store weak_ptr<Base> in your container:
// pseudo-code int main() { multi_index_container< weak_ptr<B>, // some indices
container; shared_ptr<B> p(new D1); container.insert(p);
// at some futher stage: auto iterator = container.find(someKey); auto p = iterator->lock(); // if the weak_ptr expired, i.e. no other clients use object, you may re-create it if (!p) recreateIt(); }
Hi, Igore, I'd like to first thank you for keeping helping me one this problem. I'd like to try to make my requirements clear by some pseudo codes. int main() { multi_index_container< shared_ptr<scoped_ptr<B>>, ..named_index..
container; // container own the objects.
// Insert object M of type D1 into container container.insert(shared_ptr<new scoped_ptr<B>(new D1("M"))); // more inserts follows. // A user uses an object in the container. User user; user.Use(*container.find("M")); // Erase object M may be invalid if A is used. Thus we count its number of uses if (container.find("M")->use_count() == 1) { container.erase("M"); } // Replace object M in the container to N of type D2. user use object N now since it share info with container. itorator it = container.find("M"); shared_ptr<scoped_ptr<B>>& ppb = *it; (*ppb).reset(new D2("N")); container.replace(it, ppb); } I am look for simple ways (not double pointer) to implement those requirements. Best regards, Jayden