fork download
  1.  
  2.  
  3. #include <list>
  4. #include <memory>
  5. #include <iostream>
  6. #include <exception>
  7.  
  8.  
  9. struct MyClass
  10. {
  11. static int last_number;
  12. MyClass(bool hasBreak)
  13. : number(++last_number)
  14. , hasBreak(hasBreak)
  15. {
  16. std::cout << "MyClass(" << number << ", " << hasBreak << ")" << std::endl;
  17. }
  18. ~MyClass()
  19. {
  20. std::cout << "~MyClass(" << number << ", " << hasBreak << ")" << std::endl;
  21. }
  22. int number;
  23. bool hasBreak;
  24. };
  25.  
  26. int MyClass::last_number = 0;
  27.  
  28.  
  29. std::list<std::unique_ptr<MyClass>> create_smart_ptr()
  30. {
  31. std::list<std::unique_ptr<MyClass>> result;
  32. result.emplace_back(new MyClass(false));
  33. result.emplace_back(new MyClass(false));
  34. result.emplace_back(new MyClass(false));
  35. result.emplace_back(new MyClass(false));
  36. result.emplace_back(new MyClass(true));
  37. result.emplace_back(new MyClass(false));
  38. result.emplace_back(new MyClass(false));
  39.  
  40. return result;
  41. }
  42.  
  43. std::list<MyClass*> build_no_smart_ptr(std::list<std::unique_ptr<MyClass>>& list)
  44. {
  45. std::list<MyClass*> result;
  46.  
  47. for (std::unique_ptr<MyClass>& item : list)
  48. {
  49. result.push_back(item.get());
  50. }
  51.  
  52. return result;
  53. }
  54.  
  55. void work(std::list<MyClass*>& list)
  56. {
  57. for (MyClass* item : list)
  58. {
  59. if (item->hasBreak)
  60. {
  61. std::cout << "break" << std::endl;
  62. throw std::runtime_error("failed");
  63. }
  64. }
  65. }
  66.  
  67. int main()
  68. try
  69. {
  70. std::cout << std::boolalpha;
  71.  
  72. std::list<std::unique_ptr<MyClass>> guard_ptrs(create_smart_ptr());
  73.  
  74. std::list<MyClass*> no_guard_ptrs(build_no_smart_ptr(guard_ptrs));
  75.  
  76. work(no_guard_ptrs);
  77.  
  78. return 0;
  79. }
  80. catch (const std::exception& except)
  81. {
  82. std::cout << except.what();
  83. return 1;
  84. }
  85.  
  86.  
Runtime error #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
MyClass(1, false)
MyClass(2, false)
MyClass(3, false)
MyClass(4, false)
MyClass(5, true)
MyClass(6, false)
MyClass(7, false)
break
~MyClass(1, false)
~MyClass(2, false)
~MyClass(3, false)
~MyClass(4, false)
~MyClass(5, true)
~MyClass(6, false)
~MyClass(7, false)
failed