簡體   English   中英

使用指針填充向量時出現分段錯誤

[英]Segmentation fault while populating vectors using pointers

我有一個以下形式的類:

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 個元素推入其中。 這可能會導致故障

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM