使用指针填充向量时出现分段错误

Segmentation fault while populating vectors using pointers

本文关键字:分段 错误 向量 指针 填充      更新时间:2023-10-16

>我有一个以下形式的类:

class myClass{
    vector<pair<uint64_t,uint64_t> > myvarClass;
};

main(){
    vector<myClass> myVec;
    myVec.resize(8);
    myClass obj1,obj2,obj3,obj4,obj5,obj6,obj7,obj8;
    myVec.push_back(obj1);myVec.push_back(obj2);myVec.push_back(obj3);
    myVec.push_back(obj4);myVec.push_back(obj5);myVec.push_back(obj6);
    myVec.push_back(obj7);myVec.push_back(obj8);
    myClass* obj1Ptr=&myVec[0]; myClass* obj2Ptr=&myVec[1];
    myClass* obj3Ptr=&myVec[2]; myClass* obj4Ptr=&myVec[3];
    myClass* obj5Ptr=&myVec[4]; myClass* obj6Ptr=&myVec[5];
    myClass* obj7Ptr=&myVec[6]; myClass* obj8Ptr=&myVec[7];
    obj1Ptr->myvarClass.push_back(make_pair(938474,475575));
    //populate myvarClass using obj1Ptr such that the size of myvar for each class object is 4,00,000. I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj2Ptr such that the size of myvar for each class object is 4,00,000.  I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj3Ptr such that the size of myvar for each class object is 4,00,000.  I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj4Ptr such that the size of myvar for each class object is 4,00,000. I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj5Ptr such that the size of myvar for each class object is 4,00,000. I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj6Ptr such that the size of myvar for each class object is 4,00,000. I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj7Ptr such that the size of myvar for each class object is 4,00,000. I am not showing population of 4,00,000 myvarClass objects for brevity
    //populate myvarClass using obj8Ptr such that the size of myvar for each class object is 4,00,000. I am not showing population of 4,00,000 myvarClass objects for brevity
}

当我使用 objptr 填充 myvarClass 时,我最终会在任意位置出现分段错误。是否有任何合理的原因。

之后:

myClass obj1;

然后obj1包含一个未初始化的指针。所以代码:

myVec.push_back(obj1)

按值复制未初始化的变量,这会导致未定义的行为。代码中的许多位置都会出现相同的问题。

从字里行间阅读,似乎您可能会在未显示的代码中为myPointer提供值,从而导致进一步的问题。但是,没有人可以调试您未显示的代码。

您的问题是,当您插入从 myVec 获取的指针时,可能会发生 myVec 调整大小的情况,并且指向其内容的任何指针都无效。因此你的段错误。

构建矢量时的 STL 保留预定义数量的插槽。如果您插入的元素数量超过此值,那么它将保留更多数量的插槽(通常只是两倍),并将旧插槽的内容复制到新插槽中,然后释放旧插槽。这意味着指向旧插槽的指针无效。您可以首先强制保留插槽的数量(有一个专用于此的构造函数),并克服此问题,但通常被认为是依赖以这种方式获得的指针的不良做法。以这种方式使用 std::vector 与数组相比没有优势

你的myVec大小是5,你把8个元素推入其中。这可能会导致故障