【发布时间】:2018-12-14 21:14:21
【问题描述】:
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)
只要我不删除就可以了。当我在 python 中 del a 时,我在 C++ 的“A”中创建的 shared_ptr mb 将尝试破坏由 Python 管理的 B 对象并崩溃。所以,我的问题是 C++ 中是否有一些智能指针不从原始指针获取所有权? weak_ptr 不起作用,因为我仍然需要创建一个 shared_ptr。
【问题讨论】:
-
如果智能指针没有以某种方式取得所有权,您希望它的行为是什么?
-
你可以使用一个什么都不做的自定义删除器。