Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при удалении объекта Клиента 
:(
    Опции темы
Anton2310
Дата 21.1.2017, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.1.2017

Репутация: нет
Всего: нет



Доброго времени суток, уважаемые программисты!
Бьюсь с проблемой уже продолжительное время - ничего в голову не приходит.. Помогите, пожалуйста.

Разрабатываю приложение сервер-клиент на Delphi с использованием портов завершения.
Есть объект, отвечающий за хранение данных по клиенту - создается при присоединении клиента к серверу:
Код


constructor cbMIServerClient.Create(DataRecvBufferID: Cardinal; IsCompletionPortWeight: Boolean; SizeBufferRecv: Cardinal);
var Addr: sockaddr_in;
    Size: integer;
begin
 inherited Create();
 
 fCS := TCriticalSection.Create;
 
 fClientStatus := csConnecting;
 fIsCompletionPortWeight := IsCompletionPortWeight;
 
 fDataRecvMessages := TQueue<String>.Create;
 fDataRecvBuffer := '';
 
 fAcceptTime := GetTickCount;
 fIsAuthorized := false;
 
 fBytesSend := 0;
 fBytesRecv := 0;
 
 //инициация структуры для приема трафика
 New(fDataRecv);
 with fDataRecv^
 do begin
     New(Buffer);
     GetMem(Buffer^.Buffer, SizeBufferRecv);
     Buffer^.BufferID := DataRecvBufferID;
     Buffer^.BufferLength := SizeBufferRecv;
     Buffer^.CountUsed := 0;
     DataBuf.buf := Buffer^.Buffer;
     DataBuf.len := SizeBufferRecv;
     dwFlags := 0;
     BufferTransfered := 0;
 
     iType := CMD_WSARECV;
    end;
end;


При приходе информации об отключении клиента в процедуру обработки очереди порта завершения вызываю:

Код

Dispose(ClientData);
Client.Destroy();


Сам деструктор клиента:

Код

destructor cbMIServerClient.Destroy;
begin
 fDataRecvMessages.Destroy();
 fDataRecvBuffer := '';
 
 fCS.Destroy();
 
 ZeroMemory(@fDataRecv^.Overlapped, sizeof(OVERLAPPED));
 FreeMem(fDataRecv^.Buffer^.Buffer, fDataRecv^.Buffer^.BufferLength);
 fDataRecv^.Buffer^.Buffer := NIL;
 Dispose(fDataRecv^.Buffer);
 fDataRecv^.Buffer := NIL;
 Dispose(fDataRecv);}
 
 inherited Destroy();
end;


Выходит ошибка ".. raised exception class $C0000008 with message "system exception (code 0xc0000008) at 0x624c57ea".
Скажите, пожалуйста, в чем моя ошибка?
Заранее спасибо за Ваши ответы!
PM MAIL   Вверх
bems
Дата 21.1.2017, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



ну этот эксцепшн значит invalid handle и я не вижу чтобы в приведенном коде ты работал с какими-нибудь хендлами, так что наверное эксцепшн где-то в другом месте

впрочем если у тебя overlapped-операция еще в прогрессе то ZeroMemory(@fDataRecv^.Overlapped, sizeof(OVERLAPPED)) затрёт и хендл ивента


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 21.1.2017, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



1. Берем MadExcept или FastMM (в режиме FullDebugMode), гуглим как их правильно использовать и используем. Покажут всё, от начала и до конца - где и с кем конкретно возникла ошибка.
2. Избавляемся от прямых вызовов Destroy, переходим на FreeAndNil.
3. Избавляемся от всяких pointer to record, из-за которых приходится вызывать New/Dispose. Переходим на объекты c Create и FreeAndNil.

У вас где-то ошибка в работе с памятью (ну, в принципе, это и так понятно). С объектами это отловить будет проще.
PM MAIL WWW   Вверх
bems
Дата 12.2.2017, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(kami @  21.1.2017,  23:01 Найти цитируемый пост)
ну, в принципе, это и так понятно
мне не понятно
почему?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.