Ошибка сегментации при использовании dynamic_pointer_cast - PullRequest
0 голосов
/ 28 мая 2018

Следующий фрагмент кода представляет собой MWE проблемы, с которой я сталкиваюсь std::dynamic_pointer_cast:

#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 на фрагмент тоже .

1 Ответ

0 голосов
/ 28 мая 2018

Это ожидаемое поведение.fptr управляет указателем, который указывает на foo на самом деле.Когда вы понижаете его до указателя на bar через dynamic_cast, произойдет сбой приведения, и вы получите нулевой указатель.

Если fptr указывает на bar, то это будет работать.например,

std::shared_ptr<foo> fptr = std::make_shared<bar>(b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...