在下面的代码中,我正在从函数中检索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()
实际上给出了问题。如果有人读过这个:上面的代码完全有效。
答案 0 :(得分:3)
#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);
}