Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将向量的地址传递给类的构造函数以在类中使用_C++_Qt_Vector_Constructor - Fatal编程技术网

C++ 将向量的地址传递给类的构造函数以在类中使用

C++ 将向量的地址传递给类的构造函数以在类中使用,c++,qt,vector,constructor,C++,Qt,Vector,Constructor,我试图通过在动态分配期间将地址传递给类的构造函数,将处理后的数据从类的成员函数附加到向量。为了将数据附加到构造函数中传递的向量;指向向量成员的指针采用构造函数参数的地址。然后使用该类成员附加数据。但是这种技术使得Qt中的程序崩溃。感谢您的帮助 void MainWindow::on_goButton_clicked() { //This part of the code is removed for clarity QVector<QByteArray> readDa

我试图通过在动态分配期间将地址传递给类的构造函数,将处理后的数据从类的成员函数附加到向量。为了将数据附加到构造函数中传递的向量;指向向量成员的指针采用构造函数参数的地址。然后使用该类成员附加数据。但是这种技术使得Qt中的程序崩溃。感谢您的帮助

void MainWindow::on_goButton_clicked()
{
    //This part of the code is removed for clarity
    QVector<QByteArray> readDataVec;
    for(int i = 0; i < 3; i++)
    {
        //DataExtractor object is dynamically allocated and the address of avector is passed 
        DataExtractor *newDataExtractor = new DataExtractor(&readDataVec);
        newDataExtractor->setupURL(testAPI);
        newDataExtractor->extract();
    }
}
void主窗口::点击按钮()
{
//为了清晰起见,删除了代码的这一部分
QVector readDataVec;
对于(int i=0;i<3;i++)
{
//动态分配DataExtractor对象,并传递avector的地址
DataExtractor*newDataExtractor=newDataExtractor(&readDataVec);
newDataExtractor->setupURL(testAPI);
newDataExtractor->extract();
}
}
数据提取器的构造函数

DataExtractor::DataExtractor(QVector<QByteArray> *vec)
{
    this->dataVec = vec; //dataVec is of type QVector<QByteArray>* member of the class
    qDebug() << "Constructor successful";

}

void DataExtractor::readData()
{
    this->readDataByteArray = this->reply->readAll();
    this->dataVec->push_back(x); //The ptr is used to append the data to the vector
    this->~DataExtractor(); //Dynamically allocated object is deleted
}
DataExtractor::DataExtractor(QVector*vec)
{
this->dataVec=vec;//dataVec属于类的QVector*成员类型
qDebug()readDataByteArray=此->回复->读取所有();
this->dataVec->push_back(x);//ptr用于将数据附加到向量
此->~DataExtractor();//已删除动态分配的对象
}

程序在函数
void DataExtractor::readData()
处崩溃。原因是什么?我如何解决这个问题?有没有更好的方法来解决我想要达到的目标

如@lepsch所述
QVector readDataVec
超出范围,因为它位于
for
循环块中。因此,解决方案是将
QVector readDataVec
作为类
main窗口的成员,并将地址传递给
DataExtractor
的构造函数

调用
DataExtractor::readData()
的位置?可能您正在构造的向量
DataExtractor
超出了范围,并且在堆栈上创建时已被销毁。Eww,一个调用自己的析构函数。为什么?@lepsch嘿:)是的,你是对的
QVector readDataVec
超出范围,因为
void MainWindow::on_goButton_clicked()
DataExtractor::readData()
可以完成其工作之前已完成运行(异步网络请求)。谢谢,伙计:)@NathanOliver这是因为我可以删除数据提取器,因为我不知道它什么时候能完成它的工作(异步网络回复)。因此,当类得到回复并存储数据时,我调用该类的析构函数(假设使用正确)将导致内存泄漏,因为这不会释放
new
分配的内存<代码>删除此项会更好