MSVC 14 STL矢量储备

l00*_*00k 1 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;
Run Code Online (Sandbox Code Playgroud)

例外 调试

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

Hum*_*awi 6

vector如果未初始化,则无法访问保留区域.reserve不初始化任何它只是保留(因为它被命名)一些内存不reallocatevector每次新产品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;
}
Run Code Online (Sandbox Code Playgroud)

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

现场演示

  • @Luk所以,你不知道保留如何运作. (3认同)
  • @Luk No.` []`只能在向量的*大小*内工作,而不是在其*容量内.*容量只是准备无法访问的空间,当向量增加时,向量可以增长,因此它不需要重新分配.但容量和大小之间的"缓冲区"不是矢量内容的一部分,因此无法访问. (3认同)