调试数据层中的Storage
类时出现segmentation fault (core dumped),最终将错误源头锁定在Storage
类一个成员函数中的这段代码:
//"A","B&C"
//fault
for(auto x:m_meetingList){
m<<"\""<<x.getSponsor()<<"\",\"";
for(auto iter=x.getParticipator().begin();iter!=x.getParticipator().end();++iter){
cout<<*iter;
/*auto temIter=iter;
if(++temIter!=x.getParticipator().end())
cout<<"&";
*/
}
std::cout<<std::endl;
}
错误之处:
auto iter=x.getParticipator().begin();iter!=x.getParticipator().end()
解决方法,改成这样:
std::vector<std::string> participators=x.getParticipator();
for(auto iter=participators.begin();iter!=participators.end();++iter)
全貌:
//"A","B&C"
//correct
for(auto x:m_meetingList){
m<<"\""<<x.getSponsor()<<"\",\"";
std::vector<std::string> participators=x.getParticipator();
for(auto iter=participators.begin();iter!=participators.end();++iter){
cout<<*iter;
/*auto temIter=iter;
if(++temIter!=participators.end())
cout<<"&";
*/
}
std::cout<<std::endl;
}
错误原因:
auto iter=x.getParticipator().begin();iter!=x.getParticipator().end()
x.getParticipator()
返回时隐式调用了拷贝构造函数,两个x.getParticipator()
就调用了两次拷贝构造函数,前后两个x.getParticipator()
并不是同一vector对象,引起异常。
说明:
m_meetingList
是Storage
类的私有成员,存放Meeting
类的对象。
private:
std::list<Meeting> m_meetingList;
Meeting
类的部分私有成员:赞助者的名字,参与者的名单
private:
std::string m_sponsor;
std::vector<std::string> m_participators;
getparticipator()
是Meeting
类的公有成员函数,复制m_participators
,返回出来。
/**
* @brief get the participators of a meeting
* @return return a string vector indicate participators
*/
std::vector<std::string>getparticipator(void) const;