我的班级中有同一班级的指针列表。但是当我想访问数据时,我会收到错误。我应该怎么做才能解决我的问题。我是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)
答案 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()) {
作为临时对象,将立即销毁。这意味着itr
是list
的迭代器,它不再存在。当试图通过迭代器访问对象时,程序崩溃。
当您将临时列表复制到局部变量中时,如@sergej所做的那样,或者当您返回对该对象成员的引用时,该列表在整个循环中都存在,并且迭代器指向有效列表。