Russian Qt Forum

Qt => Общие вопросы => Тема начата: mcrads от Февраль 27, 2010, 21:08



Название: Segmentation fault
Отправлено: mcrads от Февраль 27, 2010, 21:08
Почему после после удаления переменной вываливаюсь в ошибку сегментации? Причем не сразу после удаления а по завершении процедуры. в своей проге я удаляю объект класса QTcpSocket, выполняю еще строк двадцать кода и завершаю процедуру. потом получаю ошибку. однако стоит закомментить строку
Код:
//delete socket;
как сразу все в порядке. почему такая ерунда?


Название: Re: Segmentation fault
Отправлено: BRE от Февраль 27, 2010, 21:11
Так ты бы показал, как создаешь, как удаляешь....
Может ты ее два (или более) раза удаляешь. Много всего может быть.


Название: Re: Segmentation fault
Отправлено: mcrads от Февраль 27, 2010, 21:29
показывать много ) нет, я это отслеживал внимательно пошагово. удаляю один раз. у меня всегда при создании и удалении сопроводительный ключ bool created меняется. и если false - я не удаляю. к тому же если б я два раза удалял, прога бы сразу падала после строки, а не по окончании процедуры... я так думаю.


Название: Re: Segmentation fault
Отправлено: BRE от Февраль 27, 2010, 21:33
показывать много ) нет, я это отслеживал внимательно пошагово. удаляю один раз. у меня всегда при создании и удалении сопроводительный ключ bool created меняется. и если false - я не удаляю. к тому же если б я два раза удалял, прога бы сразу падала после строки, а не по окончании процедуры... я так думаю.
::)
А как можно понять, что происходить не так, если даже смотреть не куда?  ;)


Название: Re: Segmentation fault
Отправлено: mcrads от Февраль 27, 2010, 21:50
хорошо, вот две функции. одна создает или удаляет, вторая удаляет при ошибке. Конечно, если надо могу все прикрепить =) игрушка большая =)
Код:
void Seab::connectToServer()
{
    if (connectedToServer)
    {
        clientSocket->disconnectFromHost();
        delete clientSicket;
        connected ToServer = false;
    }
    else
    {
        clientSocket = new QTcpSocket(this);
        connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(connectError(QAbstractSocket::SocketError)));
        clientSocket->connectToHost(address, 54545);
        connectedToServer = true;
    }
}

Код:
void Seab::connectError(QAbstractSocket::SocketError socketError)
{
    if (socketError == QAbstractSocket::RemoteHostClosedError) QMessageBox::information(this, "Error!", "Remote Host Closed");
    if (socketError == QAbstractSocket::HostNotFoundError) QMessageBox::information(this, "Error!", "Host not found");
    else QMessageBox::information(this, "Error!", "Error");
    if (connectedToHost)
    {
        clientSocket->disconnectFromHost();
        delete clientSocket;
        connectedToHost = false;
    }
}

И вот после обработки ошибки я и вываливаюсь в ось с ошибкой сегментации. =(


Название: Re: Segmentation fault
Отправлено: BRE от Февраль 27, 2010, 21:59
Нельзя в данном месте удалять объект clientSocket, ведь именно из него происходит вызов слота connectError.
Здесь может помочь метод deleteLater().


Название: Re: Segmentation fault
Отправлено: mcrads от Февраль 27, 2010, 22:37
ах вон оно что! хорошо, спасибо, попробую!


Название: Re: Segmentation fault
Отправлено: Alex Custov от Февраль 28, 2010, 01:08
к тому же если б я два раза удалял, прога бы сразу падала после строки

Это не факт.