Sam*_*ami 4 c++ dynamic-cast shared-ptr
我已经在 StackOverflow 中看到了有关此类似错误的所有帖子,但仍然找不到导致我的问题的原因。
我用来std::dynamic_pointer_cast将std::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)
您禁用了 RTTI,在这种情况下,Microsoft 标准库的实现定义std::dynamic_pointer_cast为已删除,因为dynamic_cast没有 RTTI 就无法工作。(请参阅https://github.com/microsoft/STL/blob/main/stl/inc/memory#L2049。)
如果您想使用std::dynamic_pointer_cast.
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |