fork download
  1. #include <cstdio>
  2. #include <memory>
  3.  
  4. #define KNOTE(fmt, args...) ::printf(fmt "\n", ##args)
  5.  
  6. class CyclicB;
  7.  
  8. class CyclicA {
  9. public:
  10. ~CyclicA() {
  11. KNOTE("%s", __func__);
  12. }
  13. std::shared_ptr<CyclicB> b;
  14. };
  15.  
  16. class CyclicB {
  17. public:
  18. ~CyclicB() {
  19. KNOTE("%s", __func__);
  20. }
  21. std::shared_ptr<CyclicA> a;
  22. };
  23.  
  24. class FixCyclicB;
  25. class FixCyclicA {
  26. public:
  27. ~FixCyclicA() {
  28. KNOTE("%s", __func__);
  29. }
  30. std::shared_ptr<FixCyclicB> b;
  31. };
  32.  
  33. class FixCyclicB {
  34. public:
  35. ~FixCyclicB() {
  36. KNOTE("%s", __func__);
  37. }
  38. std::weak_ptr<FixCyclicA> a;
  39. };
  40.  
  41.  
  42. void TestSharedPtrCyclicRef()
  43. {
  44. std::shared_ptr<CyclicA> a(new CyclicA);
  45. std::shared_ptr<CyclicB> b(new CyclicB);
  46.  
  47. a->b = b;
  48. b->a = a;
  49. } // Not a nor b is deleted
  50.  
  51. void TestWeakPtrFixCyclicRef()
  52. {
  53. std::shared_ptr<FixCyclicA> a(new FixCyclicA);
  54. std::shared_ptr<FixCyclicB> b(new FixCyclicB);
  55.  
  56. a->b = b;
  57. b->a = a;
  58. }
  59.  
  60. int main()
  61. {
  62. KNOTE("\nTestSharedPtrCyclicRef");
  63. TestSharedPtrCyclicRef();
  64. KNOTE("\nTestWeakPtrFixCyclicRef");
  65. TestWeakPtrFixCyclicRef();
  66. return 0;
  67. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
TestSharedPtrCyclicRef

TestWeakPtrFixCyclicRef
~FixCyclicA
~FixCyclicB