我注意到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;
看起来operator []检查size()而不是capacity() - 我是对的吗?
答案 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
打印空字符串的情况下运行。