timer_create создает проблему с утечкой памяти «Параметр системного вызова timer_create (evp) указывает на неинициализированный байт (ы)»

#c

#c

Вопрос:

     struct sigevent timerEvent;
    memset(amp;timerEvent, 0, sizeof(timerEvent));

    timerEvent.sigev_value.sival_int = 0;
    timerEvent.sigev_value.sival_ptr = diaBase;
    timerEvent.sigev_notify = SIGEV_THREAD;
    timerEvent._sigev_un._sigev_thread._function = function;
    timerEvent._sigev_un._sigev_thread._attribute = NULL;

    timer_t timer_ID;

    int retVal;
    if((retVal = timer_create (CLOCK_REALTIME, amp;timerEvent, amp;timer_ID )) != -1)
    {
            printf("Timer Created Successfully: %ldn", timer_ID );
    }
    else
    {
            printf("Error Creating Timern");
    }
  

Утечку памяти, следующее обозначает

 Syscall param timer_create(evp) points to uninitialised byte(s)
==27384==    at 0x530595: timer_create (in /lib/librt-2.5.so)
  

Комментарии:

1. Это из выходных данных valgrind?

2. Вы проверяете наличие утечек памяти в конце выполнения программы?

3. Это сообщение не указывает на утечку памяти.

Ответ №1:

Ответ №2:

Возникла та же проблема, и valgrind остался доволен этим:

 timer_t timerId;

struct sigevent* sigev = static_cast<struct sigevent*>(calloc(1, sizeof(struct sigevent)));
sigev->sigev_notify = SIGEV_SIGNAL;
sigev->sigev_signo = SIGALRM;
sigev->sigev_value.sival_ptr = amp;timerId;

timer_create(CLOCK_REALTIME, sigev, amp;timerId);

// Use the timer
...

// After totally done with the timer
free(sigev);
  

Я использовал это в качестве ссылки: http://pubs.opengroup.org/onlinepubs/7908799/xsh/timer_create.html

Ответ №3:

Для меня это выглядит довольно неинициализированным:

 timer_t timer_ID;
  

Вы memset редактируете timerEvent , но не его.

Комментарии:

1. TimerEvent.sigev_value.sival_int = 0; TimerEvent.sigev_value.sival_ptr = diaBase; TimerEvent.sigev_notify = SIGEV_SIGNAL; TimerEvent.sigev_signo = SIGUSR1; TimerEvent._sigev_un._sigev_thread. _function = функция; TimerEvent._sigev_un._sigev_thread._attribute = NULL; Он работает с инициализацией этой структуры