Pointers 存储本地动态\u指针\u转换<&燃气轮机;()在外部范围内

Pointers 存储本地动态\u指针\u转换<&燃气轮机;()在外部范围内,pointers,c++11,shared-ptr,Pointers,C++11,Shared Ptr,在下面的代码段中,我从函数中检索共享\u ptr。然后,我动态地将指针投射到派生类,并将其存储在共享的\u ptr中。原始指针不是anullptr shared_ptr<B> storage = nullptr; if (...) { shared_ptr<A> definition = getSharedPointer(); // Store the lambda storage = dynamic_pointer_cast<B>(defin

在下面的代码段中,我从函数中检索
共享\u ptr
。然后,我动态地将指针投射到派生类,并将其存储在
共享的\u ptr
中。原始指针不是a
nullptr

shared_ptr<B> storage = nullptr;

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

  // Store the lambda
  storage = dynamic_pointer_cast<B>(definition);
}
我的逻辑错了吗?这是不是叮当作响的虫子(无法想象)

编辑

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


嗯?这太奇怪了。我已经在我的调试器中遍历了整个路径,并且我确定从
getSharedPointer()
中得到的是
B
(分配了new并传递到
shared\u ptr
)。我可以看到它发生了。@Frishert
dynamic\u cast
需要RTTI,只有在基类有一个虚拟成员的情况下才会有RTTI-是否与虚拟成员共享一个基类?(抱歉说得太明显了)没问题@Casey,bug总是出现在你认为明显正确的地方。在任何情况下:是的,层次结构中的所有类都有一个虚拟方法(析构函数)。您的调试语句输出相同的地址。事实上:即使我找到了源代码,也请参阅文章中的编辑。事实证明,问题根本不在于共享的ptr;愚蠢的错误。如果我浪费了你的时间,我向你道歉,凯西,嗯?这太奇怪了。我已经在我的调试器中遍历了整个路径,并且我确定从
getSharedPointer()
中得到的是
B
(分配了new并传递到
shared\u ptr
)。我可以看到它发生了。@Frishert
dynamic\u cast
需要RTTI,只有在基类有一个虚拟成员的情况下才会有RTTI-是否与虚拟成员共享一个基类?(抱歉说得太明显了)没问题@Casey,bug总是出现在你认为明显正确的地方。在任何情况下:是的,层次结构中的所有类都有一个虚拟方法(析构函数)。您的调试语句输出相同的地址。事实上:即使我找到了源代码,也请参阅文章中的编辑。事实证明,问题根本不在于共享的ptr;愚蠢的错误。如果我浪费了你的时间,我道歉,凯西。
storage->foo(...)->bar(...);
#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;
}
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);
}