Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2017, 15:10   #1
Anton2310
Новичок
Джуниор
 
Регистрация: 09.06.2016
Сообщений: 1
По умолчанию Ошибка при удалении объекта Клиента

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

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

Код HTML:
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;
При приходе информации об отключении клиента в процедуру обработки очереди порта завершения вызываю:

Код HTML:
Dispose(ClientData);
Client.Destroy();
Сам деструктор клиента:

Код HTML:
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".
Скажите, пожалуйста, в чем моя ошибка?
Заранее спасибо за Ваши ответы!
Anton2310 вне форума Ответить с цитированием
Старый 24.01.2017, 21:58   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

У Вас работа клиента идет в потоке? Если да то в Create объекта пропишите FreeOnTerminate := True; тогда это Client.Destroy(); ненужно он сам уничтожиться по завершению и выполнит все то что прописано в Destroy.
Еще попробуйте FreeMem(fDataRecv^.Buffer^.Buffer, fDataRecv^.Buffer^.BufferLength); сделать так FreeMem(fDataRecv.Buffer.Buffer); без BufferLength в Destroy

Последний раз редактировалось Aliens_wolfs; 24.01.2017 в 22:57.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при удалении файла Replicant Общие вопросы Delphi 13 29.08.2016 06:34
Ошибка при удалении компонента Putin-mode Общие вопросы Delphi 18 24.01.2012 23:28
ошибка 1004 при удалении объекта типа Range Red_Garry Microsoft Office Excel 2 26.02.2011 15:12
Ошибка при удалении из БД!!! Delphi 7. NuR1k БД в Delphi 2 21.08.2010 19:19
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53