我有这段代码:
class BuffComponent : public Component
{
public:
using BuffMap =
std::unordered_map<Effect, std::unique_ptr<EffectComponent>>;
BuffMap buffs;
BuffComponent() {}
BuffComponent(const BuffComponent &buff_component)
{
for (auto &buff : buff_component.buffs)
{
this->buffs[buff.first] =
std::unique_ptr<EffectComponent>(buff.second->clone());
}
}
BuffComponent(std::initializer_list<EffectComponent *> buffs_list)
{
for (auto &buff : buffs_list)
{
buffs[(buff->effect & ~(APPLIED | APPLY_ONCE))] =
std::unique_ptr<EffectComponent>(buff);
}
}
BuffComponent *clone() const override { return new BuffComponent(*this); }
};
编译非常好。我的主要看起来像这样(用于测试)
int main()
{
std::cout << "I HAVEN'T CRASHED!";
std::unique_ptr<BuffComponent> i(new BuffComponent());
}
基类 Component 类如下所示:
class Component
{
public:
virtual Component *clone() const = 0;
virtual ~Component() {}
};
我遇到的问题是,无论出于何种原因,程序崩溃并且不显示
"I HAVEN'T CRASHED!"
。我什至无法使用 gdb 调试它,因为它会立即退出,退出代码为 139(我发现这与内存有关)。我的问题是,我的理解有什么问题?我看不到任何明显的东西会导致它编译但在运行时失败。
当负责地图访问的行在 for each 循环中被注释时,程序不会崩溃并且可以正常运行。这让我相信访问地图会以某种方式违反内存,但我不明白为什么。我真的很感激任何帮助,这让我发疯