我注意到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() - 我是对的吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
您可能在调试模式下编译错误(取决于您的编译器),它可能会传递并给出未定义的行为(不确定未定义的行为,请有人编辑此部分).在最好的情况下,它将与打印空字符串运行v[2].