MSVC 14 STL矢量储备

时间:2015-12-29 07:56:53

标签: c++ stl

我注意到MSVC 14 Comm上的奇怪行为(IMO)。在Debug x86解决方案中。 下面的代码在不包含vector :: resize时抛出异常。 注意:在分配之后,可以通过传递nullptr来取消分配某些实体。

vector<Entity*> m_entities;

(...)

// find empty slot
u_int id = m_entities.size();
for(u_int i=0; i<m_entities.size(); ++i)
{
    if(m_entities[i] == nullptr)
    {
        id = i;
        break;
    }
}

// vector realloc
if(id == m_entities.capacity())
{
    u_int newSize = m_entities.capacity() * 2;
    m_entities.reserve(newSize);
    //m_entities.resize(newSize);
}

// assign
entity->m_id = id;
m_entities[id] = entity;

exception debug

看起来operator []检查size()而不是capacity() - 我是对的吗?

1 个答案:

答案 0 :(得分:6)

如果未初始化,则无法访问vector的保留区域。 reserve每次新项目reallocate

时,vector都不会初始化它只保留(因为它被命名)的内容而不是pushed back #include <iostream> #include <string> #include <vector> class my_class{ public: my_class(){ x="I am an initialized item"; } std::string x; }; int main() { std::vector<my_class> v(2); v.reserve(3); std::cout << v[0].x <<std::endl<< v[1].x <<std::endl <<v[2].x; }

尝试运行此代码:

v[2]

您可能在调试模式下编译错误(取决于您的编译器),它可能会传递并给出未定义的行为(不确定未定义的行为,请有人编辑此部分)。在最好的情况下,它会在src打印空字符串的情况下运行。

Live Demo