2012-12-02 49 views
1

我觉得好像我要对这个正确的方式,但我不断收到错误“EXC错误访问”访问类载体,载体

我有一个类person,一切公共相当简单。

class person 
{ 
    public: 
    int id; 
    vector<float> scores; 
    float avgscore; 
}; 

我然后使用新的操作者

vector<person> *people = new vector<person>[num_persons]; 

然后我试图访问类内的矢量作出的person个矢量person

(*people)[current_person].scores.push_back(temp); 

其中current_person = 0,并且temp是一个整数。

我是否正确处理矢量?

+0

我在stackoverflow搜索周围,似乎初始化应该使用圆括号,即新的向量(num_persons);但我不知道为什么是这样,而且看起来不一致。将upvote这个答案。 – jonathanasdf

+0

这并不矛盾。使用[]进行初始化的* only *事物是C风格的数组。其他所有使用()(或{}用于初始化列表)。这是有道理的,因为你不会'删除'矢量指针。 – Max

+0

@Max注意:'std :: map <>'使用'operator []()'在失败查找后进行隐式插入。其余的我同意。 – WhozCraig

回答

2

试试这个:

vector<person> people(num_persons); 

然后......

people[current_person].scores.push_back(temp); 
+0

这仍然让我错误的访问错误,尽管在不同的地方 – user1869173

+0

适合我,请参阅http://codepad.org/sBBGfKs0 – combinatorial

+0

对不起,家伙,问题是与for循环越过向量边界,案例研究草率。尽管如此,谢谢你! – user1869173

1

此行

vector<person> *people = new vector<person>[num_persons]; 

新的向量仅创建载体,但它包含0个元素,访问到(*people)[0]是您的错误消息EXC BAD ACCESS讲述故事的未定义行为。您仍然需要为访问它的人添加人物元素,例如

person p1; 
people->push_back(p1); // add element to vector 
(*people)[0].scores.push_back(temp); // now you are ok to visit first element. 
// don't forget to delete vector at right place 
delete people; 

由于您已经在使用矢量,因此您可以继续使用矢量而不是使用原始指针。

std::vector<person> people; 
person p1; 

people.push_back(person); 
people[position].scores.pus_back(score); 
// don't need to worry releasing people memory anymore.