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

时间:2015-09-30 19:59:18

标签: c++ segmentation-fault

我的班级中有同一班级的指针列表。但是当我想访问数据时,我会收到错误。我应该怎么做才能解决我的问题。我是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;

  };

这是我的主要功能:

  #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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

从评论中,方法getTargets()被定义为

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

这将返回一份在

中使用的副本
list<Alpha*>::iterator itr = it->getTargets().begin();

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

作为临时对象,将立即销毁。这意味着itrlist的迭代器,它不再存在。当试图通过迭代器访问对象时,程序崩溃。

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