0

在设置 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 ???)

到目前为止,我无法在调试器中复制此问题以获取任何其他信息。

任何想法可能导致访问冲突?

4

1 回答 1

0

根据 Remy Lebeau 的评论,解决方案是从 TIdHTTP 对象中删除所有者:

改变

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

TIdHTTP* httpClient = new TIdHTTP(NULL);
于 2019-06-24T15:49:06.453 回答