This question already has an answer here:
Type erasure in C++: how boost::shared_ptr and boost::function work?
(1个答案)
6年前关闭。
我有此函数,它将从
我问是因为lambda不会评估采用派生类型吗?但是,然后强制转换的指针将 (在您的代码中)每个实例都有一个指向指向对象的共享单个控制块的指针。 至少从概念上讲,它还具有指向该指针的原始指针,该指针暗指该实例所隐含的类型。由于类型的原因,可以调整此原始指针,而不是与原始指针指针相同的位模式。 该控制块包含原始的原始pointe指针,引用计数和原始的删除函数。调用deleter func(如果是的话)时,将原始的原始pointee指针作为参数。
投射时,仅影响新的
(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
的工作方式:
投射时,仅影响新的
shared_ptr
实例,而不影响它指向的控制块。因此,删除所需的信息完全不受影响。即使实例的(概念上)键入的pointe指针可能会受到影响。