fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. class Foo
  5. {
  6. std::string name;
  7. Foo(const std::string& _name) : name(_name) {}
  8. public:
  9. void doIt() const { std::cout << "Foo::doIt() <" << name << '>' << std::endl;}
  10. virtual ~Foo() { std::cout << "~Foo() <" << name << '>' << std::endl;}
  11.  
  12. static std::unique_ptr<Foo> create_unique(const std::string & _name) {
  13. return std::unique_ptr<Foo>(new Foo(_name));
  14. }
  15. static std::shared_ptr<Foo> create_shared(const std::string & _name) {
  16. return std::shared_ptr<Foo>(new Foo(_name));
  17. }
  18.  
  19. static std::shared_ptr<Foo> to_shared(std::unique_ptr<Foo> &&ptr ) {
  20. return std::shared_ptr<Foo>(std::move(ptr));
  21. }
  22. static std::shared_ptr<Foo> get_shared(const std::shared_ptr<Foo> &ptr) {
  23. return std::shared_ptr<Foo>(std::move(ptr));
  24. }
  25. };
  26.  
  27. int main() {
  28. // ok behavior
  29. auto pb1 = Foo::create_unique("pb1");
  30. pb1->doIt();
  31. std::shared_ptr<Foo> pb2 = Foo::get_shared(std::move(pb1));
  32. //note the change below
  33. std::shared_ptr<Foo> pb3 = Foo::get_shared(pb2);
  34. pb3->doIt();
  35.  
  36. // also OK behavior
  37. auto pb4 = Foo::create_unique("pb4");
  38. pb4->doIt();
  39. std::shared_ptr<Foo> pb5 = Foo::to_shared(std::move(pb4)); // no exception now
  40. pb5->doIt();
  41.  
  42. std::shared_ptr<Foo> pb6 = Foo::create_shared("pb6");
  43. pb6->doIt();
  44. std::shared_ptr<Foo> pb7 = std::shared_ptr<Foo>(pb6);
  45. pb7->doIt();
  46. return 0;
  47. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
Foo::doIt() <pb1>
Foo::doIt() <pb1>
Foo::doIt() <pb4>
Foo::doIt() <pb4>
Foo::doIt() <pb6>
Foo::doIt() <pb6>
~Foo() <pb6>
~Foo() <pb4>
~Foo() <pb1>