Нарушения периодического доступа при настройке объекта TIdHTTP - PullRequest
0 голосов
/ 19 июня 2019

Я борюсь с периодическими нарушениями доступа при настройке объекта TIdHTTP. Я использую следующий код:

TIdHTTP* httpClient = new TIdHTTP(Application->MainForm);
httpClient->HTTPOptions = (httpClient->HTTPOptions >> hoForceEncodeParams);
httpClient->HTTPOptions = (httpClient->HTTPOptions << hoKeepOrigProtocol);
httpClient->HTTPOptions = (httpClient->HTTPOptions << hoInProcessAuth);
httpClient->Request->ContentType = L"application/json";
httpClient->Request->CharSet = L"UTF-8";

TIdSSLIOHandlerSocketOpenSSL* sslIOHandler = new TIdSSLIOHandlerSocketOpenSSL;
sslIOHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;

httpClient->IOHandler = sslIOHandler;

httpClient->Request->BasicAuthentication = false;
httpClient->Request->Authentication = new TIdSSPINTLMAuthentication;
httpClient->Request->Username = connectionInfo->AuthUsername;
httpClient->Request->Password = connectionInfo->AuthPassword;

// Make a request from a REST API

delete sslIOHandler;
delete httpClient;

Этот код выполняется в потоке (TThread). В любой момент времени может быть несколько активных потоков, делающих отдельные запросы. По завершении каждого запроса поток уничтожается.

Этот код работает большую часть времени , но после запуска в течение, по-видимому, случайного количества времени начнут выбрасывать нарушения доступа, обычно в виде:

Access violation at address 5016C927 in module 'rtl210.bpl'. Read of address 00000008

Как только нарушения доступа начнутся, все последующие потоки будут генерировать аналогичные нарушения доступа. Единственный способ восстановить ситуацию - закрыть приложение и перезапустить.

Я использую C ++ Builder XE7 с версией Indy, поставляемой с компилятором (Indy 10.6.1.5182 ???)

До сих пор мне не удавалось воспроизвести эту проблему в отладчике, чтобы получить дополнительную информацию.

Есть идеи, что может быть причиной нарушения прав доступа?

1 Ответ

0 голосов
/ 24 июня 2019

Согласно комментарию Реми Лебо, решением было удалить владельца из объекта TIdHTTP:

Изменить

TIdHTTP* httpClient = new TIdHTTP(Application->MainForm);

на

TIdHTTP* httpClient = new TIdHTTP(NULL);
...