【发布时间】:2021-10-14 15:46:42
【问题描述】:
以下代码 sn-p 在dynamic_cast 期间导致分段错误。谁能向我解释为什么会发生这种情况?
#include <cassert>
#include <cstdint>
uint8_t buffer[32];
class Top {
public:
virtual ~Top() = default;
};
template <typename T>
class Middle : public Top {
public:
void copy() {
// Create copy of class instance in buffer
auto memory{reinterpret_cast<T *>(buffer)};
*memory = *dynamic_cast<T *>(this);
// Upcast, works
Top * topPtr{memory};
assert(topPtr != nullptr);
// Downcast, causes segmentation fault, why?
auto bottomPtr{dynamic_cast<T *>(topPtr)};
}
};
class Bottom : public Middle<Bottom> {
};
int main() {
Bottom b;
b.copy();
}
谢谢。
【问题讨论】:
-
您是否尝试过调试代码?如果您执行
reinterpret_cast<T *>(buffer),则取消引用是未定义的行为,因为那里没有T对象。 -
你用枪指着你的脸并扣动了扳机,但并不知情。您不能将分配为 uint8_t[32] 的内存转换为对象,您以错误的方式管理内存。 reinterpret_cast 很微妙,应谨慎使用
-
我不认为它是 dynamic_cast 但可能是对复制构造函数的调用。而且我不知道你为什么要这样做,但这看起来真的很顽皮。
-
@JosephLarson 甚至都不是复制构造函数,那是复制赋值使情况变得更糟。
-
是的。当我试图弄清楚他想要做什么时,我不禁打了个寒颤。
标签: c++ copy polymorphism dynamic-cast