使用dynamic_pointer_cast时出现分段错误

时间:2018-05-28 01:20:09

标签: c++ shared-ptr dynamic-cast

以下代码段是我与std::dynamic_pointer_cast遇到的问题的MWE:

#include <iostream>
#include <memory>

class foo {
private:
    int x;
public:
    foo() : x(0) {}
    foo(int xx) : x(xx) {}
    virtual ~foo() = default;
    int get_x() const { return x; }
};

class bar : public foo {
private:
    double y;
public:
    bar(double yy) : foo(), y(yy) {}
    double get_y() const { return y; }
};

int main(void) {
    bar b(0.5);
    std::shared_ptr<foo> fptr = std::make_shared<foo>(b);
    std::cout << (std::dynamic_pointer_cast<bar>(fptr))->get_x();
    return 0;
}

此程序在输出流行(std::cout << ...)处发生段错误,可能是因为dynamic_pointer_cast导致nullptr,但我不确定为什么会出现这种情况?

我们非常感谢您的帮助,此外还有Coliru link to the snippet too

1 个答案:

答案 0 :(得分:2)

这是预期的行为。 fptr实际上管理指向foo的指针。当你通过dynamic_cast将其向下转换为指向bar的指针时,强制转换会失败并且你会得到一个空指针。

如果fptr指向bar,那么它就可以正常工作。 e.g。

std::shared_ptr<foo> fptr = std::make_shared<bar>(b);
相关问题