2

我有这个函数,它将派生自容器的任何类添加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 不会评估为采用派生类型吗?但是然后转换的指针会将 a 传递Object*给那个 lambda?那么在调用自定义删除时不会发生一些“向上转换”吗?我认为这是不可能的,因为您不能保证基类型是派生类型?

4

1 回答 1

3

这是 a 的boost::shared_ptr工作原理:

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

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

  • 控制块包含原始原始指针、引用计数和原始删除函数。使用原始指针指针作为参数调用删除函数(何时以及如果是)。

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

于 2012-08-18T14:02:01.727 回答