C++ 获取错误分段错误(内核转储)进程返回139(0x8B)

C++ 获取错误分段错误(内核转储)进程返回139(0x8B),c++,segmentation-fault,C++,Segmentation Fault,我在我的类中有一个相同类的指针列表。但是当我想访问数据时,我会出错。我应该怎么做来解决我的问题。我是C++新手,我没办法解决这个问题。 #include <iostream> #include <list> using namespace std; class Alpha { public: Alpha() {} Alpha(int val) : i(val) {} virtual ~Alpha() {} void addT

我在我的类中有一个相同类的指针列表。但是当我想访问数据时,我会出错。我应该怎么做来解决我的问题。我是C++新手,我没办法解决这个问题。
#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;

  };

这是你所期望的吗

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++;
}

根据注释,方法
getTargets()
定义为

list<Alpha*> getTargets() const
{
    return targets;
}
作为临时物品,将立即销毁。这意味着
itr
列表的迭代器,该列表已不存在。当试图通过迭代器访问对象时,程序崩溃


当您像@sergej那样将临时列表复制到局部变量中,或者当您返回对对象成员的引用时,列表在整个循环中都存在,迭代器指向一个有效列表。

我看不到方法
getTargets()
在任何定义的地方。为了代码简洁,我没有将它放在这里。它实际上作为setter和getter存在于Alpha.h类中。由于它使用@sergej的代码,我猜
getTargets()
返回一个副本而不是引用。这就是我要求提供方法定义的原因。我想我是在返回一个副本。我将代码从list getTargets()const{return targets;}更改为list&getTargets(){return targets;}。现在我意识到我的问题是什么。谢谢。它现在正在工作,但我仍然不明白为什么当我试图迭代本地目标而不复制到新列表时它不工作?谢谢你的详细解释。
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
list<Alpha*> getTargets() const
{
    return targets;
}
list<Alpha*>::iterator itr = it->getTargets().begin();
while(itr != it->getTargets().end()) {