Есть ли в C ++ умный указатель на ресурс, управляемый другими?Я использую pybind11, чтобы обернуть код C ++ следующим образом.
class B {};
class A {
public:
// original C++ class interface
A(std::shared_ptr<B> pb) : mb(pb){}
// have to add this for pybind11, since pybind11 doesn't take shared_ptr as argument.
A(B * pb):A(std::shared_ptr<B>(pb)){}
private:
std::shared_ptr<B> mb;
}
namespace py = pybind11;
PYBIND11_MODULE(test, m)
{
py::class_<B>(m, "B")
.def(py::init<>());
py::class_<A>(m, "A")
.def(py::init<B *>());
}
Затем в python я буду использовать их следующим образом:
b = B()
a = A(b)
Это хорошо, пока я нетель а.Когда я делаю a в Python, mb shared_ptr, который я создал в C ++, 'A' будет пытаться уничтожить объект B, которым управляет Python, и аварийно завершить работу.Итак, мой вопрос: есть ли в C ++ какой-нибудь умный указатель, который не получает владения от необработанного указателя?weak_ptr не будет работать, потому что мне все равно придется создать shared_ptr.