2015-06-18 2 views
-3

У меня есть класс следующего вида:ошибка сегментации при заполнении векторов с использованием указателей

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 
} 

Когда я заселить myvarClass с помощью ObjPtr-х я в конечном итоге получить ошибку сегментации в произвольном местах. Есть ли правдоподобная причина того же.

+0

@dyp Спасибо за pointing..that был typo..i поправили, что –

+0

@MohitJain Я пытаюсь заполнить вектор MyCLASS –

+0

@marom имеет проблемы прямо –

ответ

2

После:

myClass obj1; 

затем obj1 содержит неинициализированный указатель. Таким образом, код:

myVec.push_back(obj1) 

копирует неинициализированную переменную по значению, что приводит к неопределенному поведению. Такая же проблема возникает во многих местах вашего кода.

Чтение между строками, кажется, что вы можете дать значения myPointer в коде, который вы не показывали, что приводит к дальнейшим проблемам. Однако никто не может отлаживать код, который вы не показывали.

+0

Я удалил неинициализированный указатель из моего кода, но мой код дает мне ошибку сегментации. Я думаю, что изменение размера myvarClass может быть потенциальной причиной ошибки сегментации. Как вы думаете?Поскольку myvarClass получает размер до 4 000 000 –

+0

@StegVerner, в коде, который вы опубликовали, нет segfault. Это должно быть в коде, который вы не отправляли. –

0

Ваша проблема заключается в том, что при вводе указателей из myVec может случиться так, что myVec будет изменен, а любые указатели на его содержимое недействительны. Отсюда ваши segfaults.

STL при создании вектора резервирует предопределенное количество слотов. Если количество вставленных вами элементов превышает это значение, тогда будет зарезервировано большее количество слотов (как правило, их просто удвоить) и скопируйте содержимое старых слотов в новое, а затем отпустите старые слоты. Это означает, что указатели на старые слоты становятся недействительными. Вы можете заставить количество слотов зарезервировано в первую очередь (для этого есть выделенный конструктор) и преодолеть эту проблему, но обычно считается плохой практикой, основанной на указателях, полученных таким образом. Используемый таким образом std :: vector не имеет преимущества по сравнению с массивом

+0

Я думаю, что вы правы. Не могли бы вы объяснить немного больше. –

+0

Если вам нужно сохранить дескрипторы (могут быть указатели, но итераторы еще лучше) к элементу вашего контейнера, то вам следует использовать связанный список вместо вектора. – dureuill

+1

На самом деле я не вижу, чтобы myVec изменялся после первого указателя. – MikeMB

-3

Ваш размер myVec равен 5, и вы вставляете в него 8 элементов. Это может привести к неисправности

+0

Это не проблема, 'std :: vector' изменит размер. – TartanLlama

+0

'push_back' подталкивает новый элемент к концу. У вектора будет 13 элементов после завершения нажатия –