2016-10-28 6 views
0

Я использую 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 предоставляет функции для освобождения этих ресурсов?

Заранее благодарим за мой английский.

ответ

0

Ну, пройдя глубже до конца до soapcpp2 Найден вариант -Ed witch генерирует soap_del_T макросы для каждого типа, используемые gsoap.

 Смежные вопросы

  • Нет связанных вопросов^_^