Я использую gsoap для реализации некоторого веб-сервиса в моей программе на C.gsoap и управление ресурсами
Я использую gsoap так:
int motion_detector_check_status(const char *endpoint,
const motion_detector_subscription_result_t *sr, int *status) {
int rc = EXIT_SUCCESS;
double _timeout = difftime(sr->termination_time, sr->current_time);
char timeout[TIMEOUT_MAX_LEN];
struct soap *soap = soap_new();
struct _tev__PullMessages request;
struct _tev__PullMessagesResponse response;
char *motion_state;
if (!soap) return EXIT_FAILURE;
snprintf(timeout, TIMEOUT_MAX_LEN, "PT%.0fS", _timeout < 5.0 ? _timeout : 5.0);
request.MessageLimit = 1;
request.Timeout = _timeout < 5.0 ? (int64_t)_timeout : 5.0;
request.__any = timeout;
request.__size = sizeof(timeout) + 1;
rc = soap_call___tev__PullMessages(soap, endpoint, SOAP_ACTION_PULL_MESSAGE,
&request, &response);
if (rc != SOAP_OK) {
soap_print_fault(soap, stderr);
goto end;
}
if (response.wsnt__NotificationMessage &&
response.wsnt__NotificationMessage->Topic &&
response.wsnt__NotificationMessage->Topic->__any) {
if (strstr(response.wsnt__NotificationMessage->Topic->__any, MOTION_ALARM_SRC)) {
motion_state = strstr(response.wsnt__NotificationMessage->Message.__any,
"<tt:SimpleItem Name=\"State\" Value=");
if (strcasestr(motion_state, "true"))
*status = 1;
else
*status = 0;
}
}
motion_detector_check_status_free_response(&response);
end:
soap_end(soap);
soap_destroy(soap);
soap_free(soap);
return rc;
}
Все работает хорошо, но struct _tev__PullMessagesResponse
имеет некоторые указатели на уголь и другие структуры.
Когда я запускаю свою программу в valgring
, он сказал мне, что у меня есть утечки памяти и ресурсы, на которые ссылаются указатели внутри response
, не являются бесплатными после окончания motion_detector_check_status
. Конечно, я мог бы написать эти функции самостоятельно, но мне интересно, gsoap предоставляет функции для освобождения этих ресурсов?
Заранее благодарим за мой английский.