在外部作用域中存储本地dynamic_pointer_cast<>()

时间:2013-08-01 15:01:03

标签: pointers c++11 shared-ptr

在下面的代码中,我正在从函数中检索shared_ptr<A>。然后,我将指针动态转换为派生类,并将其存储在shared_ptr<B>中。原始指针 a nullptr

shared_ptr<B> storage = nullptr;

if (...)
{
  shared_ptr<A> definition = getSharedPointer();

  // Store the lambda
  storage = dynamic_pointer_cast<B>(definition);
}

我希望dynamic_pointer_cast和存储到storage将总引用计数增加到2.然后,当我离开if语句的范围时,storage的引用伯爵应该是一个。

然而,当我尝试在存储上调用方法时,我得到一个EXC_BAD_ACCESS,暗示我正在读取已删除的指针。

storage->foo(...)->bar(...);

我的逻辑错了吗?这是clang中的错误(无法想象)吗?

修改

我似乎找到了错误,这与指针无关。函数bar()实际上给出了问题。如果有人读过这个:上面的代码完全有效。

1 个答案:

答案 0 :(得分:3)

This example works fine:

#include <memory>

using namespace std;

struct A {
    virtual ~A() {}
};
struct B : A {};

shared_ptr<A> getSharedPointer() {
    return make_shared<B>();
}

#include <iostream>

int main() {
    shared_ptr<B> storage = nullptr;

    if (true)
    {
      shared_ptr<A> definition = getSharedPointer();

      // Store the lambda
      storage = dynamic_pointer_cast<B>(definition);
    }

    cout << storage.get() << endl;
}

您的shared_ptr<A>似乎没有指向B,而dynamic_pointer_cast的结果似乎是nullptr。也许调试声明会有所帮助:

if (...)
{
  shared_ptr<A> definition = getSharedPointer();
  cerr << "as A: " << definition.get()
       << ", as B: " << dynamic_cast<B>(definition.get()) << endl;

  // Store the lambda
  storage = dynamic_pointer_cast<B>(definition);
}