【问题标题】:static_pointer_cast with custom delete [duplicate]带有自定义删除的 static_pointer_cast [重复]
【发布时间】:2012-08-18 22:02:01
【问题描述】:

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

【问题讨论】:

  • 等一下。您正在创建一个shared_ptr 的向量,其中每个shared_ptr 都有一个空删除器?
  • @pmr 如果通过此方法添加对象,则可以。我有另一种方法void registerObject(std::shared_ptr&lt;Object&gt;)。这是为了阻止它尝试删除不应该删除的内容。
  • @rhalbersma 看起来不像那个问题的重复。
  • @johannes:对不起,我盲目投票。应该先看看。我不确定你的意思是什么,但现在看了之后我也不完全确定重复性,所以。那我就回答ze问题。 hrmpf.

标签: c++ casting


【解决方案1】:

boost::shared_ptr 的工作原理如下:

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

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

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

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

【讨论】:

  • 我使用的是 C++11 shared_ptr,我认为是一样的吗?看来我需要在shared_ptrs 上做更多的阅读:)谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2015-08-15
  • 2015-12-22
相关资源
最近更新 更多