2015-02-19 4 views
0

Можно ли удалить единственную ссылку shared_ptr для себя внутри метода? Что-то вроде следующего. Если два объекта, один из классов A и другого класса B, указывают друг на друга через их pB_ и pA_. Предположим, что pB_ является единственной ссылкой на объект класса B. Затем я вызываю A::method() на объект класса A. Будут ли проблемы?Можно ли удалить ссылку shared_ptr на себя

#include <iostream> 
using std::shared_ptr 

class B; 
class A { 
public: 
    void method() { 
    pB_->method(); 
    } 
    shared_ptr<B> pB_; 
}; 

class B { 
public: 
    void method() { 
    pA_->pB_.reset(); 

    // Is this OK? And is it safe if I don't do this? 
    some_other_data_ = 10; 
    } 
    shared_ptr<A> pA_; 

    int some_other_data_; 
}; 
+0

Это жутко похоже на то, что раньше было смехотворно распространенной ошибкой, сделанной программистами COM много лет назад. 'if (--m_dwRefCount == 0) удалить это; return m_dwRefCount; 'Я не могу сказать вам, сколько раз я видел этот кодекс и записывал * профессионально * опубликованные компоненты. – WhozCraig

+0

Это, возможно, хуже, так как это также небезопасно. Два потока могут решить в тот же момент прекратить использование вашего COM-компонента, чтобы вам понадобилась эта функция блокировки с уменьшением. – MSalters

ответ

1

Сброс этого указателя приведет к B объекта удаляются, так что нет, это не хорошо, чтобы получить доступ к одному из своих членов после этого момента. Для получения дополнительной информации см.: Is it safe to `delete this`?

+0

Спасибо! Как насчет того, если я не получаю данные после сброса. В этом случае ОК? – shaoyl85

+0

Правила такие же, как если бы вы вызывали 'delete' на объект, выделенный' new'. Если вы хотите узнать больше, нажмите «C++ delete this» в свою любимую поисковую систему. (Или посмотрите [здесь] (http://stackoverflow.com/questions/3150942/c-delete-this).) –

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