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);