将对象添加到矢量时出现分割错误
Segmentation fault when adding object to vector
当我将对象添加到向量"clientVect"时,我得到了一个分割错误。你能帮我找出问题吗?
这是类:
#include "ClientDB.h"
ClientDB::ClientDB(){
}
ClientDB::~ClientDB(){
}
void ClientDB::addClient(QString name,QString fname,int id,QString bdate,int cellnb)
{
Client c= Client(name,fname,id,bdate,cellnb);
this->clientVect.push_back(c);
}
vector <vector<QString*> > ClientDB::showRenters(){
using namespace std;
int i;
int j=0;
QString id,cellnb,rentedcar;
vector <vector<QString*> > list;
for(i=0;i<clientVect.size();i++){
if (clientVect[i].renter==true){
(list[j]).push_back(&clientVect[i].name);
(list[j]).push_back(&clientVect[i].fname);
id=QString::number(clientVect[i].id);
(list[j]).push_back(&id);
(list[j]).push_back(&clientVect[i].bdate);
cellnb=QString::number(clientVect[i].cellnb);
(list[j]).push_back(&cellnb);
rentedcar=QString::number(clientVect[i].rentedCar);
(list[j]).push_back(&rentedcar);
j++;
}
}
return list;
}
vector <vector<QString*> > ClientDB::showAll(){
using namespace std;
int i;
QString id,cellnb,rentedcar;
vector <vector<QString*> > list;
for(i=0;i<clientVect.size();i++){
(list[i]).push_back(&clientVect[i].name);
(list[i]).push_back(&clientVect[i].fname);
id=QString::number(clientVect[i].id);
(list[i]).push_back(&id);
(list[i]).push_back(&clientVect[i].bdate);
cellnb=QString::number(clientVect[i].cellnb);
(list[i]).push_back(&cellnb);
rentedcar=QString::number(clientVect[i].rentedCar);
(list[i]).push_back(&rentedcar);
}
return list;
}
这是标题:
#ifndef CLIENTDB_H
#define CLIENTDB_H
#include "Client.h"
#include <vector>
#include <QString>
using namespace std;
class ClientDB
{
public:
vector<Client> clientVect;
void addClient(QString,QString,int,QString,int);
vector <vector<QString*> >showRenters();
vector <vector<QString*> >showAll();
ClientDB();
~ClientDB();
};
#endif // CLIENTDB_H
问题肯定出在ClientDB::addClient
,特别是在clientVect.push_back(....)
,但我看不出原因。
showRenters()
和showAll()
都访问尚未推送list
元素,因此无效。 即使元素有效,showRenters()
和showAll()
也会将多个指针推送到相同的局部变量,这是行不通的。 在每次循环迭代中,变量都会被新数据覆盖,因此您最终会得到多个引用相同物理数据的vector
元素。 更糟糕的是,当showRenters()
和showAll()
退出时,变量会超出范围并被释放,返回的向量充满了无效指针。
如果要返回字符串的二维向量,请改用以下内容:
vector <vector<QString> > ClientDB::showRenters(){
using namespace std;
vector <vector<QString> > list;
// optional: list.reserve(clientVect.size());
for(int i=0;i<clientVect.size();i++){
if (clientVect[i].renter){
vector<QString> values;
// optional: values.reserve(6);
values.push_back(clientVect[i].name);
values.push_back(clientVect[i].fname);
values.push_back(QString::number(clientVect[i].id));
values.push_back(clientVect[i].bdate);
values.push_back(QString::number(clientVect[i].cellnb));
values.push_back(QString::number(clientVect[i].rentedCar));
list.push_back(values);
}
}
return list;
}
vector <vector<QString> > ClientDB::showAll(){
using namespace std;
vector <vector<QString> > list;
// optional: list.reserve(clientVect.size());
for(int i=0;i<clientVect.size();i++){
vector<QString> values;
// optional: values.reserve(6);
values.push_back(clientVect[i].name);
values.push_back(clientVect[i].fname);
values.push_back(QString::number(clientVect[i].id));
values.push_back(clientVect[i].bdate);
values.push_back(QString::number(clientVect[i].cellnb));
values.push_back(QString::number(clientVect[i].rentedCar));
list.push_back(values);
}
return list;
}
vector <vector<QString> > list = db.showRenters(); // or showAll()
for (int i=0; i<list.size();i++) {
vector<QString> &values = list[i];
// use values as needed...
}
否则,请更改代码以改为返回Client*
指针的一维向量,并让调用方根据需要决定如何处理客户端数据。 只要在调用方使用返回的向量时不更改clientVect
,Client*
指针将保持有效:
vector <Client*> ClientDB::showRenters(){
using namespace std;
vector <Client*> list;
// optional: list.reserve(clientVect.size());
for(int i=0;i<clientVect.size();i++){
if (clientVect[i].renter){
list.push_back(&clientVect[i]);
}
}
return list;
}
vector <Client*> ClientDB::showAll(){
using namespace std;
vector <Client*> list;
// optional: list.reserve(clientVect.size());
for(int i=0;i<clientVect.size();i++){
list.push_back(&clientVect[i]);
}
return list;
}
vector <Client*> list = db.showRenters(); // or showAll()
for (int i=0; i<list.size();i++) {
Client *client = list[i];
// use client as needed...
}
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误