C++ c+中结构与对象属性和std::vector的交互+;

C++ c+中结构与对象属性和std::vector的交互+;,c++,vector,segmentation-fault,C++,Vector,Segmentation Fault,我遇到了这个问题,我想知道它的原因是什么 我的代码如下: struct node{ bool leaf; std::string label; }; //in main std::vector<node> graph; graph.reserve(5); 并为向量中节点的每个实例中的字符串分配内存,现在我可以毫无问题地为graphA[I]->label分配一个值 为什么会这样?如有任何回复,将不胜感激 现在,如果我尝试分配graph[3].leaf=true 您正在调用未

我遇到了这个问题,我想知道它的原因是什么

我的代码如下:

struct node{
  bool leaf;
  std::string label;
};

//in main
std::vector<node> graph;
graph.reserve(5);
并为向量中
节点
的每个实例中的字符串分配内存,现在我可以毫无问题地为
graphA[I]->label分配一个值

为什么会这样?如有任何回复,将不胜感激

现在,如果我尝试分配
graph[3].leaf=true

您正在调用未定义的行为

图形
在索引3处没有元素。事实上,它没有任何元素。您仅为向量保留
d内存,但未向其添加任何元素

您可以使用
resize
添加5个默认构造元素:

graph.resize(5);
现在,如果我尝试分配
graph[3].leaf=true,一切顺利

需要强调的是,这仅仅是巧合。没有效果-您有未定义的行为,因为当
图形
为空时,您可以访问
图形[3]
。如果程序立即崩溃,让你注意到出了问题,那就更好了

graph
为空,因为您混淆了
std::vector
reserve
resize
成员函数。您不需要将向量的元素计数设置为5,只需要让它为将来至少5个元素准备其内部内存
std::vector
甚至可以忽略此请求

当你做
graphA[i].label=“01”
那么为什么第一个版本和指针“fix”(它也调用未定义的行为)看起来工作正常,而另一个崩溃了呢?C++作为一种编程语言,不能区分不同类型的未定义行为。strong>任何事情都可能发生;你也可能会经历第一次崩溃和第二次“成功”的情况。这就是未定义行为的本质

实际上,这里可能发生的情况是,在
bool
std::string*
的情况下,您同时向允许您的程序写入的内存位置写入,因为您只处理单个
bool
或单个指针。在
std::string
版本中,由于所有
std::string
的自动动态内存管理都发生在后台,内存中涉及到更多的位置,因此碰巧遇到了禁止的位置


但这只是一个非常投机的理论。如果您确实想知道,请调试代码并逐步执行每个操作。但请记住,未定义的行为总是未定义的行为。

graph.reserve(5)=>
图形。调整大小(5)应该修复它。您不需要指针和
new
。请尝试
graph。在(3)
处,要获得更好的错误消息
reserve
仅保留,向量仍然为零elements@tobi303:如果异常离开
main
,则可能不会有好的错误消息。
graph.resize(5);