This question already has an answer here:
Type erasure in C++: how boost::shared_ptr and boost::function work?

(1个答案)


6年前关闭。




我有此函数,它将从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中会发生什么,使自定义delete方法对新指针仍然有效?

我问是因为lambda不会评估采用派生类型吗?但是,然后强制转换的指针将Object*传递给该lambda吗?那么调用自定义删除时是否不会发生某些“向上转换”?我以为不可能,因为您不能保证基本类型是派生类型?

最佳答案

这是boost::shared_ptr的工作方式:

  • (在您的代码中)每个实例都有一个指向指向对象的共享单个控制块的指针。
  • 至少从概念上讲,它还具有指向该指针的原始指针,该指针暗指该实例所隐含的类型。由于类型的原因,可以调整此原始指针,而不是与原始指针指针相同的位模式。
  • 该控制块包含原始的原始pointe指针,引用计数和原始的删除函数。调用deleter func(如果是的话)时,将原始的原始pointee指针作为参数。

  • 投射时,仅影响新的shared_ptr实例,而不影响它指向的控制块。因此,删除所需的信息完全不受影响。即使实例的(概念上)键入的pointe指针可能会受到影响。

    09-10 05:22
    查看更多