0

这个会有点刺痛:\。这是我的地图声明:

std::map<std::string, std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > > > m_EntityByClassList;

真的,它这么长的唯一原因是智能指针声明,几乎就是这样:

std::map<std::string, std::vector<BaseEntity *> *> m_EntityByClassList;

虽然读起来还是很痛苦。这是我的问题。当我尝试将对象插入地图中的新向量时,出现“试图读取访问冲突”运行时错误。

产生此错误的代码块是这样的,

for(;;)
    {
        file >> classname;
        if(file.eof())
            break;
        m_EntityList.push_back( m_factory.createInstance(classname));
        m_EntityList.back()->Initialize();
        m_EntityList.back()->GetParams(file);
        m_EntityByNameList[m_EntityList.back()->GetName()] = m_EntityList.back();
        m_EntityByClassList[classname]->push_back(m_EntityList.back());
    }

现在是的,肯定有很多代码我在这里省略了,主要是因为这里有 35 或 36 个对象和文件进入这个简介,所以我只想列出相关的东西。file 是std::ifstream一个打开的文件, classname 是 an std::string, m_EntityList 是 a std::vector<std::shared_ptr<BaseEntity> >(不应该重要), m_EntityByNameList 是具有索引类型std::string和对象类型std::shared_ptr<BaseEntity>(也应该不重要)的映射,然后是上面的映射。最后一个上面的所有陈述都完全正确,结果经过验证。如果省略最后一行,它会编译并工作得很好。

所以这个问题与其余文件无关,只是关于尝试向地图添加矢量并向其添加对象。如果您觉得您还需要其他任何东西,请询问,我会考虑将其张贴在这里。发布所有内容很容易是 4000-4500 行。

Annnnyway,我从中学到的关于地图的知识,使用带有尚未存在的索引的 [ ] 运算符将为您创建一个索引以及该索引处的默认构造对象。所以我从中得到的是,std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > >将在索引类名处创建一个,这意味着我应该能够访问该向量,无论它是事先创建的还是之前创建的。那么有人知道发生了什么吗?

4

1 回答 1

1

在地图上使用operator[]不存在的键确实会插入一个新的shared_ptr. 但是,您没有考虑到 newshared_ptr将是空的(即空指针),因此取消引用它会导致未定义的行为。不会创建新向量 - 因为您使用的是指向向量的指针,所以您需要自己分配一个新向量。

如果您的地图的值类型是向量本身而不是指向它的指针,它将按照您的预期自动创建。

于 2012-07-01T14:50:48.383 回答