Можно ли удалить единственную ссылку 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_;
};
Это жутко похоже на то, что раньше было смехотворно распространенной ошибкой, сделанной программистами COM много лет назад. 'if (--m_dwRefCount == 0) удалить это; return m_dwRefCount; 'Я не могу сказать вам, сколько раз я видел этот кодекс и записывал * профессионально * опубликованные компоненты. – WhozCraig
Это, возможно, хуже, так как это также небезопасно. Два потока могут решить в тот же момент прекратить использование вашего COM-компонента, чтобы вам понадобилась эта функция блокировки с уменьшением. – MSalters