2015-12-29 55 views
1

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

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

它看起来像运营商[]检查大小(),而不是能力() - 是吗?

+0

是的,这是正确的。 –

回答

6

如果未初始化,则不能访问vector的保留区域。 reserve不初始化任何它只是储备(因为它被命名)一些内存每次新产品pushed back

尝试运行该代码不reallocatevector

#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]的打印空字符串。

Live Demo

+0

是的,我知道如何保留工作,但如果向量重新分配内存,那么为什么我不能通过被引用的[]运算符来访问它。 – l00k

+3

@Luk所以,你不知道储备是如何工作的。 – juanchopanza

+0

@juanchopanza我的回答有问题吗? –