static_pointer_cast自定义删除

时间:2012-08-18 13:14:21

标签: c++ casting

我有这个函数,它将从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?那么在调用自定义删除时是不是会发生一些“向上转换”?我认为这是不可能的,因为你不能保证基类型是派生类型?

1 个答案:

答案 0 :(得分:3)

以下是boost::shared_ptr的工作原理:

  • 每个实例(在您的代码中)都有一个指向指针对象的共享单个控件块的指针。

  • 至少从概念上讲,它还有一个指向该实例隐含类型的指针对象的原始指针。由于此原始指针的类型可以调整,而不是与原始指针指针相同的位模式。

  • 控制块包含原始指针指针,引用计数和原始删除函数。删除函数被调用(当它是时),原始指针指针作为参数。

当你施放时,你只影响新的shared_ptr实例,而不是它所指向的控制块。因此,删除所需的信息根本不受影响。即使实例的(概念)类型指针指针可能会受到影响。