为什么在我什至没有积极使用的部分代码中访问地图会使程序崩溃?

问题描述 投票:0回答:0

我有这段代码:

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 循环中被注释时,程序不会崩溃并且可以正常运行。这让我相信访问地图会以某种方式违反内存,但我不明白为什么。我真的很感激任何帮助,这让我发疯

c++ pointers memory unique-ptr unordered-map
© www.soinside.com 2019 - 2024. All rights reserved.