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