Я использую libudev для обнаружения USB-устройств.
Инициализация монитора и фильтра:
struct udev* udev = udev_new();
if (udev == nullptr) { /* error handling */ }
struct udev_monitor* usb = udev_monitor_new_from_netlink(udev, "udev");
udev_monitor_filter_add_match_subsystem_devtype(usb, "usb", NULL);
udev_monitor_enable_receiving(usb);
while(! canceled) { /* setup fd, poll fd, process result */ }
Затем я освобождаю выделенные ресурсы:
udev_monitor_unref(usb);
udev_unref(udev);
Но иногда я получаю
* обнаружен glibc * ./ usbtest: поврежденный двойной связанный список: 0x084cc5d0 ***
Я пытался использовать:
free(usb);
free(udev);
Но потом Valgrind жалуется на утечки памяти.
Какой правильный способ освободить память в этом случае?
Согласно документация должно быть достаточно использовать:
udev_unref(udev);
а также Вот говорит:
udev_monitor_unref(usb);
должен освободить этот ресурс. Если это дает вам двойную свободу, то что-то не так, и вам действительно нужно отладить эту проблему, а не пытаться обойти ее другими способами.
Других решений пока нет …