2012-08-18 8 views
0

Я получаю ошибку сегментации в моем коде, но у меня проблемы с поиском проблемы. Это часть кода, где ошибка сегментации, кажется, имеют место:Что вызывает ошибку сегментации в этом коде?

for (i = 0; i < ROBOTCOUNT; i++) 
{ 
    ROS_INFO("Test 1"); 
    Robot r; 
    robotList.push_back(&r); 
    ROS_INFO("Test 2"); 
} 

При запуске Печатается только две следующие строки

Test 1 
Test 2 

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

Что может быть причиной этого?

+0

Что такое 'ROS_INFO'? это 'robotList' вектор' Robot'? –

+0

Это для печати в ROS – Jigglypuff

+0

Есть ли веская причина для robotList хранить указатели на объекты робота, а не на самих объектах? то есть имеет смысл изменить «вектор » на «вектор » (или список или что-то еще)? –

ответ

2

Вы сохраняете адрес локальной переменной, который уничтожен в вашем списке.

for (i = 0; i < ROBOTCOUNT; i++) 
{ 
    ROS_INFO("Test 1"); 
    Robot r; <== local variable 
    robotList.push_back(&r); <== save address of local 
    ROS_INFO("Test 2"); 
} <== r is destroyed 

Так что, скорее всего, вы получаете доступ к памяти удален позже

std::vector<std::shared_ptr<Robot>> Использование:

std::vector<std::shared_ptr<Robot>> v; 
std::shared_ptr<Robot> ptr(new Robot()); 
v.push_back(ptr) 
+0

А я вижу. Спасибо за ответ. Есть ли способ сделать так, чтобы г не был уничтожен? Или другой способ создания объектов в цикле для хранения адресов в векторе? – Jigglypuff

+2

Но это не вызовет segfault. Segfault - это то место, где он обращается к предметам. @Jigglypuff do Robot * r = новый робот; –

+0

@Jigglypuff: да, используйте вектор умных указателей. – Andrew

Смежные вопросы