QTcpSocket, SIGSEGV при использовании указателя - PullRequest
0 голосов
/ 23 марта 2011

Я получаю SIGSEGV в 'QScopedPointer', когда пытаюсь использовать указатель на QTcpSocket, если вместо этого я использую переменную, все работает нормально ...

Я создаю экземпляр QTcpSocket как указатель и подключаю сигнал 'readyRead ()' следующим образом:

AlphaNetworkComm::AlphaNetworkComm(QWidget *parent) : QMainWindow(parent) {
    ui.setupUi(this);

    sock = new QTcpSocket(this); // QTcpSocket * sock; is declared in the .h
    connect(sock,SIGNAL(readyRead()), this, SLOT(socketDataAvailable()));
    sock->connectToHost("10.10.50.147",2101);
    if (sock->waitForConnected(2000)==false) {
        qDebug("Connection failed!");
    } else {
        qDebug("Connection successful!");

        QByteArray data;
        QDataStream out(&data, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_1);
        out << qint8(0x02) << qint8(0x00) << qint8(0x48) 
            << qint8(0x01) << qint8(0x49) << qint8(0x15) 
            << qint8(0x12);
        sock->write(data);
    }
}

Этот код выполняется без ошибок. Однако, когда вызывается слот socketDataAvailable ():

void AlphaNetworkComm::socketDataAvailable() {
    QByteArray rxData;
    rxData = sock->readAll();
    qDebug(QString("Rx: [%1]").arg(bytes2String(rxData)).toStdString().c_str());
}

Приложение SIGSEGV в QScopedPointer. Если я избавлюсь от указателя и просто использую переменную, все работает нормально. Я что-то упускаю из виду? Qt удаляет мой QTcpSocket * между инициализацией и вызываемым слотом? Нужно ли делать что-то явное, чтобы сохранить это?

Спасибо!

...