Shared_ptr std::dynamic_pointer_cast 失败并出现“尝试引用已删除的函数”错误

Sam*_*ami 4 c++ dynamic-cast shared-ptr

我已经在 StackOverflow 中看到了有关此类似错误的所有帖子,但仍然找不到导致我的问题的原因。

我用来std::dynamic_pointer_caststd::shared_ptr<Base>对象转换为std::shared_ptr<DerivedShared>对象,但遇到“尝试引用已删除的函数”错误。我已确保Base析构函数是虚拟的,但错误仍然存​​在。

可能是什么原因导致此错误?我该如何解决它?标准库中是否存在任何可能导致此问题的已知限制或错误?任何见解或建议将不胜感激。

PS:我知道它可以工作,static_pointer_cast但想知道是什么导致了问题dynamic_pointer_cast

struct Base
{
    Base() = default;
    virtual ~Base() = default;
    //Copy
    Base(const Base&) = default;
    Base& operator=(const Base&) = default;
    //Move
    Base(Base&&) = default;
    Base& operator=(Base&&) = default;
};


struct DerivedShared : public  Base
{
public:
    DerivedShared() //: data(std::shared_ptr<int[]>(new int[3]{1,2,3}))
    {
        //data = std::make_shared<int[]>(new int[3]{ 1,2,3 });
        data = std::shared_ptr<int[]>(new int[3]{ 1,2,3 });
    }
    
public:
    std::shared_ptr<int[]> data;
};

int main()
{
    std::cout << "----------------------------------------\n";
    std::shared_ptr<Base> base5 = std::make_shared<DerivedShared>();
    for (size_t i = 0; i < 3; ++i)
    {
        std::cout << std::dynamic_pointer_cast<DerivedShared>(base5)->data[i] << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*522 9

您禁用了 RTTI,在这种情况下,Microsoft 标准库的实现定义std::dynamic_pointer_cast为已删除,因为dynamic_cast没有 RTTI 就无法工作。(请参阅https://github.com/microsoft/STL/blob/main/stl/inc/memory#L2049。

如果您想使用std::dynamic_pointer_cast.