2015-08-17 2 views
-1

У меня есть два указателя, указывающих на один и тот же объект, и мне нужно их правильно удалить (удалить каждый объект A и внутренний объект B). Но проблема в том, что у общего объекта все еще есть память, выделенная после удаления: Висячий указатель. Как я могу избежать такой проблемы без использования интеллектуального указателя.Два указателя на тот же объект

 class A 
     { 

     public: 
      class B 
      { 
      private: 
       A* m_x; 
       A* m_y; 
      public: 
       B(A* x, A* y); 
       ~B(); 
      }; 

      B* m_b; 
      A(){}; 
      void Join(A* other); 
      ~A(); 
     }; 

     void A::Join(A* person) 
     { 
      this->m_b= new A::B(this, person); 
      person->m_b= this->m_b; 
     } 

     A::~A() 
     { 
      if (m_b) 
      { 
      delete m_b; 
      m_b= NULL; 
      } 
     } 

     ... 

     A aa = new A(); 
     A cc = new A(); 
     aa->Join(cc); 
     delete aa 

     // here I have a problem in deleting the *m_b because it's deleted by the first A 
     delete cc; 
+0

Можете ли вы показать свои деструкторы '~ A()' и '~ B()'? –

+1

Вам, вероятно, нужно будет выполнить подсчет ссылок самостоятельно, если вы не хотите использовать 'std :: shared_ptr'. –

+0

@MaksimSolovjov Я добавил свой A destructor –

ответ

1

Без умных указателей, лучшее, что вы могли бы сделать, это разъединить ваш aa и cc во время разрушения. Но не делайте этого, используйте std::shared_ptr и забыть о подобных головных болей:

// annul pointers to this shared object 
B::detach() { 
    if (m_x) m_x->m_b = NULL; 
    if (m_y) m_y->m_b = NULL; 
} 

A::~A() { 
    // use a temporary pointer, because B::detach will annul the pointers here 
    if (m_b) { 
     B* tmp = m_b; 
     tmp->detach(); 
     delete tmp; 
    } 
} 

Такой код очень плохо. Это недостижимо, классы связаны, и я даже не уверен, что это правильно.

+0

Хорошо, спасибо, решает проблему, но вы можете предоставить мне пример о том, как ее решить с помощью std :: shared_ptr –

+0

Если вы используете интеллектуальные указатели вместо обычных указатели в каждом месте вашего исходного кода и ничего не предпринимают в деструкторах, тогда все три объекта будут уничтожены, когда оба 'aa' и' cc' выйдут из области видимости. Это немного другая логика, но я думаю, что это предпочтительнее, потому что это просто. –

+0

В то же время все три объекта будут существовать, если существует хотя бы один из 'aa' или' cc'; однако это редко бывает проблемой –

Смежные вопросы