C++ 由于connect';上的问题,代码崩溃;荷兰国际广播公司;狭槽

C++ 由于connect';上的问题,代码崩溃;荷兰国际广播公司;狭槽,c++,qt,signals-slots,C++,Qt,Signals Slots,我有下面的代码创建人对象,并通过QVector存储对象。出于调试目的,我添加了一个名为foo()的信号和一个名为outputData()的插槽,以查看QVector(list)是否正确存储了值 我通过以下方式连接信号和插槽: connect(People, SIGNAL(foo()), this , SLOT( outputData() ) ); 在mainwindow.cpp文件上。Gcc构建代码,不输出任何错误或警告。但是,当我运行程序时,SIGSEV会终止进程 谁能告诉我connec

我有下面的代码创建
对象,并通过
QVector
存储对象。出于调试目的,我添加了一个名为
foo()
的信号和一个名为
outputData()
的插槽,以查看QVector(
list
)是否正确存储了值

我通过以下方式连接信号和插槽:

 connect(People, SIGNAL(foo()), this , SLOT( outputData() ) ); 
在mainwindow.cpp文件上。Gcc构建代码,不输出任何错误或警告。但是,当我运行程序时,
SIGSEV
会终止进程

谁能告诉我
connect()
上的错误是什么

存储对象是否正确使用了
QVector

code.pro

QT       += core gui
QT += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = untitled1
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    people.cpp

HEADERS  += mainwindow.h \
    people.h

FORMS    += mainwindow.ui
main window.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUdpSocket>
#include <QString>
#include "people.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();
   // void outputData();
public slots:
    void outputData();
private slots:
    void readyRead();



signals: void foo();

private:
    Ui::MainWindow *ui;
    QUdpSocket udpSocket;
    people *People;
    void processPendingDatagrams();
    void udp_transfer(QString data);
    void ParseData(QByteArray data);
};
#endif // MAINWINDOW_H
#ifndef PEOPLE_H
#define PEOPLE_H

#include <QObject>
#include <QString>
#include <QMainWindow>

class people : public QObject
{
    Q_OBJECT
public:
    people();
    people(QString Name, int Age);
    QString getName();
    int getAge();
    void setName(QString Name);
    void setAge(int Age);


private:
   QString name;
   int age;
};

#endif // PEOPLE_H

People
似乎是一个未初始化的指针。您不需要创建
people
对象,只需在
connect
调用中使用未初始化的指针即可。然后,这将尝试访问
people
可能指向的任意随机内存位置的
people
对象,从而导致分段错误


您可能希望首先创建
人员
对象,例如将
人员(new People())
添加到初始值设定项列表中。

人员
似乎是未初始化的指针。您不需要创建
people
对象,只需在
connect
调用中使用未初始化的指针即可。然后,这将尝试访问
people
可能指向的任意随机内存位置的
people
对象,从而导致分段错误


您可能希望首先创建
人员
对象,例如将
人员(new People())
添加到初始值设定项列表中。

人员
似乎是未初始化的指针。您不需要创建
people
对象,只需在
connect
调用中使用未初始化的指针即可。然后,这将尝试访问
people
可能指向的任意随机内存位置的
people
对象,从而导致分段错误


您可能希望首先创建
人员
对象,例如将
人员(new People())
添加到初始值设定项列表中。

人员
似乎是未初始化的指针。您不需要创建
people
对象,只需在
connect
调用中使用未初始化的指针即可。然后,这将尝试访问
people
可能指向的任意随机内存位置的
people
对象,从而导致分段错误


您可能想先创建
人物
对象,例如,将
人物(new People())
添加到初始值设定项列表中。

谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,
foo()
main窗口的一个信号,而不是
People
,那么它真的不是
connect(这个,信号(foo(),…)
?而
People
则不需要成为类的成员变量,因为它只在
ParseData()中使用。它可能只是该函数中的局部变量。关于向量:推到它并访问这样的元素应该会起作用。也许将其设置为
MainWindow
的成员变量而不是全局变量更合适,但这取决于您计划对其执行的其他操作。非常感谢。我注意到我试图解决的(信号)问题。在您的评论之后,它也解决了:)谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,
foo()
main窗口的一个信号,而不是
People
,那么它真的不是
connect(这个,信号(foo(),…)
?而
People
则不需要成为类的成员变量,因为它只在
ParseData()中使用。它可能只是该函数中的局部变量。关于向量:推到它并访问这样的元素应该会起作用。也许将其设置为
MainWindow
的成员变量而不是全局变量更合适,但这取决于您计划对其执行的其他操作。非常感谢。我注意到我试图解决的(信号)问题。在您的评论之后,它也解决了:)谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,
foo()
main窗口的一个信号,而不是
People
,那么它真的不是
connect(这个,信号(foo(),…)
?而
People
则不需要成为类的成员变量,因为它只在
ParseData()中使用。它可能只是该函数中的局部变量。关于向量:推到它并访问这样的元素应该会起作用。也许将其设置为
MainWindow
的成员变量而不是全局变量更合适,但这取决于您计划对其执行的其他操作。非常感谢。我注意到我试图解决的(信号)问题。在您的评论之后,它也解决了:)谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,
foo()
main窗口的一个信号,而不是
People
,那么它真的不是
connect(这个,信号(foo(),…)
?而
People
则不需要成为类的成员变量,因为它只在
ParseData()中使用。它可能只是该函数中的局部变量。关于向量:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>
#include <QtNetwork>
#include <QVector>


QVector<people*> list;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   udpSocket.bind(2222); 
    connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
    connect(People, SIGNAL(foo()), this , SLOT( outputData() ) );   //HERE IS THE PROBLEMATIC PART!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}


MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::readyRead(){
    do {
      QByteArray datagram;
      datagram.append(udpSocket.pendingDatagramSize());
      udpSocket.readDatagram(datagram.data(), datagram.size());
      ParseData(datagram);
    } while (udpSocket.hasPendingDatagrams());

}



void MainWindow::ParseData(QByteArray data){
    QString name;
    int i = 0;
    for (i=0; i<4; i++){
        name.append(QString("%1").arg(data[i]));
    }

    QString temp;
    for (i=0; i<2; i++){
        temp.append(QString("%1").arg(data[i+4]));
    }
    int age = temp.toInt();
    People = new people(name, age);
    qDebug() << "msg is received";
    list.push_back(People);
    emit foo();

}


void MainWindow::outputData(){
    qDebug() << "size:" << list.size();
    qDebug() <<  "name:" << list[0]->getName();
    qDebug() <<  "Age:" << list[0]->getAge();
}
#include "people.h"

people::people(){
   name = "No name";
   age = 0;
}

people::people(QString Name, int Age){
   name = Name;
   age = Age;
}

QString people::getName(){
    return name;
}

int people::getAge(){
   return age;
}

void people::setName(QString Name){
    name = Name;
}

void people::setAge(int Age){
    age = Age;
}