fork download
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <memory>
  4. using namespace std;
  5.  
  6. struct bus_t
  7. {
  8. bus_t()
  9. {
  10. cout << "bus_t()" << endl;
  11. }
  12.  
  13. ~bus_t()
  14. {
  15. cout << "~bus_t()" << endl;
  16. }
  17. };
  18.  
  19. int open_bus(bus_t **bus)
  20. {
  21. *bus = new bus_t;
  22. return 0;
  23. }
  24.  
  25. int free_bus(bus_t *bus)
  26. {
  27. delete bus;
  28. }
  29.  
  30. struct bus_deleter
  31. {
  32. void operator()(bus_t *bus)
  33. {
  34. free_bus(bus);
  35. }
  36. };
  37.  
  38. int my_open_bus(unique_ptr<bus_t, bus_deleter> &bus)
  39. {
  40. bus_t *temp = nullptr;
  41. int ret_code = open_bus(&temp);
  42. bus = std::move(decltype(bus)(temp));
  43. return ret_code;
  44. }
  45.  
  46. bool foo()
  47. {
  48. unique_ptr<bus_t, bus_deleter> bus;
  49. if(my_open_bus(bus) != 0)
  50. {
  51. return false;
  52. }
  53.  
  54. // jeśli nie chcesz implementować własnego open_bus, to:
  55. unique_ptr<bus_t, bus_deleter> bus2;
  56. {
  57. bus_t *bus_temp = nullptr;
  58. if(open_bus(&bus_temp) != 0)
  59. {
  60. return false;
  61. }
  62. bus2 = decltype(bus2)(bus_temp);
  63. }
  64. }
  65.  
  66. int main() {
  67. foo();
  68. return 0;
  69. }
Success #stdin #stdout 0s 4508KB
stdin
Standard input is empty
stdout
bus_t()
bus_t()
~bus_t()
~bus_t()