C++ 向向量添加对象时出现分割错误

C++ 向向量添加对象时出现分割错误,c++,qt,object,vector,C++,Qt,Object,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,

当我将对象添加到向量“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;
}
#包括“ClientDB.h”
ClientDB::ClientDB(){
}
ClientDB::~ClientDB(){
}
void ClientDB::addClient(QString名称、QString fname、int id、QString bdate、int cellnb)
{
客户c=客户(名称、fname、id、bdate、cellnb);
此->客户端向量向后推(c);
}
vector ClientDB::showRenters(){
使用名称空间std;
int i;
int j=0;
QString id、cellnb、rentedcar;
向量表;
for(i=0;i
showRenters()
showAll()
都在访问尚未推送的元素,因此这些元素无效。即使这些元素有效,
showRenters()
showAll()
也会将多个指针推送到同一个局部变量,这是行不通的。在每次循环迭代中,变量都会被新数据覆盖,因此最终会有多个
向量
元素引用相同的物理数据。更糟糕的是,当
showRenters()
showAll()时
exit,变量将超出范围并被释放,返回的向量将充满无效指针

如果要返回字符串的二维向量,请使用以下命令:

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 list=db.showRenters();//或showAll()

对于(inti=0;iTry附加一个调试器…你会学到很多东西的):)谢谢,我没有想清楚:p.这可能是分段错误的原因吗?因为它只发生在我调用ClientDB::addClient时。问题不在于
addClient()
。问题在于
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...
}
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...
}