Russian Qt Forum
Ноябрь 27, 2024, 00:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Segmentation fault  (Прочитано 3868 раз)
mcrads
Гость
« : Февраль 27, 2010, 21:08 »

Почему после после удаления переменной вываливаюсь в ошибку сегментации? Причем не сразу после удаления а по завершении процедуры. в своей проге я удаляю объект класса QTcpSocket, выполняю еще строк двадцать кода и завершаю процедуру. потом получаю ошибку. однако стоит закомментить строку
Код:
//delete socket;
как сразу все в порядке. почему такая ерунда?
Записан
BRE
Гость
« Ответ #1 : Февраль 27, 2010, 21:11 »

Так ты бы показал, как создаешь, как удаляешь....
Может ты ее два (или более) раза удаляешь. Много всего может быть.
Записан
mcrads
Гость
« Ответ #2 : Февраль 27, 2010, 21:29 »

показывать много ) нет, я это отслеживал внимательно пошагово. удаляю один раз. у меня всегда при создании и удалении сопроводительный ключ bool created меняется. и если false - я не удаляю. к тому же если б я два раза удалял, прога бы сразу падала после строки, а не по окончании процедуры... я так думаю.
Записан
BRE
Гость
« Ответ #3 : Февраль 27, 2010, 21:33 »

показывать много ) нет, я это отслеживал внимательно пошагово. удаляю один раз. у меня всегда при создании и удалении сопроводительный ключ bool created меняется. и если false - я не удаляю. к тому же если б я два раза удалял, прога бы сразу падала после строки, а не по окончании процедуры... я так думаю.
Строит глазки
А как можно понять, что происходить не так, если даже смотреть не куда?  Подмигивающий
Записан
mcrads
Гость
« Ответ #4 : Февраль 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;
    }
}

И вот после обработки ошибки я и вываливаюсь в ось с ошибкой сегментации. =(
Записан
BRE
Гость
« Ответ #5 : Февраль 27, 2010, 21:59 »

Нельзя в данном месте удалять объект clientSocket, ведь именно из него происходит вызов слота connectError.
Здесь может помочь метод deleteLater().
Записан
mcrads
Гость
« Ответ #6 : Февраль 27, 2010, 22:37 »

ах вон оно что! хорошо, спасибо, попробую!
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Февраль 28, 2010, 01:08 »

к тому же если б я два раза удалял, прога бы сразу падала после строки

Это не факт.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.155 секунд. Запросов: 23.