2015-09-30 2 views
-1

У меня есть список указателей того же класса внутри моего класса. но когда я хочу получить доступ к данным, я получаю сообщение об ошибке. Что я должен сделать, чтобы решить мою проблему. Я новичок на C++, и я не могу понять эту проблему.получение ошибки сегментации ошибок (core dumped) возвращено 139 (0x8B)

#include <iostream> 
#include <list> 
using namespace std; 
class Alpha 
{ 
    public: 

    Alpha() {} 

    Alpha(int val) : i(val) {} 

    virtual ~Alpha() {} 

    void addTarget(Alpha* alpha) 
    { 
     targets.push_back(alpha); 
    } 

    void display() { 
     cout << i << " -------------"; 
    } 

    private: 
    int i; //!< Member variable "i" 
    list<Alpha*> targets; 

    }; 

и вот моя главная функция:

#include <iostream> 
    #include <list> 
    #include "Alpha.h" 
    using namespace std; 

    int main() 
    { 
    list<Alpha> teamA, teamB; 

    Alpha* alptr; 
    for(int i = 0; i < 3; i++) 
    { 
    alptr = new Alpha; 
    teamA.push_back(*alptr); 
    alptr = nullptr; 
    } 

    for(int i = 0; i < 3; i++) 
    { 
    alptr = new Alpha; 
    teamB.push_back(*alptr); 
    alptr = nullptr; 
    } 

    list<Alpha>::iterator it = teamA.begin(); 

    for(;it != teamA.end(); it++) 
    { 
    for(list<Alpha>::iterator itr = teamB.begin(); 
            itr != teamB.end();itr++) 
    { 
     it->addTarget(&(*itr)); 
    } 
} 
it = teamA.begin(); 
list<Alpha*>::iterator itr = it->getTargets().begin(); 
/// now trying to access it 
while(itr != it->getTargets().end()) 
{ 
    (*itr)->display(); 
    itr++; 
} 

return 0; 
} 

А вот мой выход:

segmentation fault (core dumped) process returned 139 (0x8B) 
+0

Я не вижу метод 'getTargets()' в любом месте. –

+0

Я не ставил его здесь для краткости кода. На самом деле это внутри класса Alpha.h как сеттер и геттер. – meysamabl

+0

Поскольку он работает с кодом @ sergej, я думаю, 'getTargets()' возвращает копию вместо ссылки. Вот почему я попросил определение метода. –

ответ

1

ли это, что вы ожидаете?

it = teamA.begin(); 
list<Alpha*> targets = it->getTargets(); // local targets list copy! 
list<Alpha*>::iterator itr = targets.begin(); 

/// now trying to access it 
while (itr != targets.end()) 
{ 
    (*itr)->display(); 
    itr++; 
} 

Проблема в коде:

list<Alpha*>::iterator itr = it->getTargets().begin(); 
//         ^ ^
//          |  | 
// returns a temporary list copy -------+  | 
// returns an iterator to the temp. list copy --+ 

Теперь временный список будет уничтожен.

(*itr)->display(); 
    itr++; 
// ^
// | 
// +--- ERROR: iterator to a list that has been destroyed 
+0

Сейчас он работает, но я до сих пор не понимаю, почему он не работал, когда я пытался перебирать локальные цели, не копируя их в новый список ? – meysamabl

1

Как из комментариев, метод getTargets() был определен как

list<Alpha*> getTargets() const 
{ 
    return targets; 
} 

Это возвращает копию, который был использован в

list<Alpha*>::iterator itr = it->getTargets().begin(); 

и

while(itr != it->getTargets().end()) { 

, как временный объект, который w плохо уничтожить немедленно. Это означает, что itr является итератором до list, который больше не существует. При попытке доступа к объекту через итератор программа выходит из строя.

Когда вы копируете временный список в локальную переменную, как это делал @sergej, или когда вы возвращаете ссылку на элемент объекта, список существует во всем цикле, и итератор указывает на допустимый список.

+0

Благодарим вас за подробное объяснение. – meysamabl

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