我有这个函数,它将从Object
派生的任何类添加到容器中。
template<class T> void registerObject(T& object) {
auto sp = std::shared_ptr<T>(&object, [](T*){});
std::shared_ptr<Object> op = std::static_pointer_cast<Object>(sp);
objects_.push_back(op);
}
static_pointer_cast
会使自定义删除方法对新指针有效吗?
我问,因为lambda不评估采用派生类型吗?但是那个铸造的指针会将Object*
传递给那个lambda?那么在调用自定义删除时是不是会发生一些“向上转换”?我认为这是不可能的,因为你不能保证基类型是派生类型?
答案 0 :(得分:3)
以下是boost::shared_ptr
的工作原理:
每个实例(在您的代码中)都有一个指向指针对象的共享单个控件块的指针。
至少从概念上讲,它还有一个指向该实例隐含类型的指针对象的原始指针。由于此原始指针的类型可以调整,而不是与原始指针指针相同的位模式。
控制块包含原始指针指针,引用计数和原始删除函数。删除函数被调用(当它是时),原始指针指针作为参数。
当你施放时,你只影响新的shared_ptr
实例,而不是它所指向的控制块。因此,删除所需的信息根本不受影响。即使实例的(概念)类型指针指针可能会受到影响。