Как исправить poco Poco :: Net :: TCPServerParams () valgrind определенная утечка - PullRequest
0 голосов
/ 23 мая 2019

Я использую Poco и создаю параметры TCP-сервера, как показано ниже: Poco :: Net :: TCPServerParams * pParams = новый Poco :: Net :: TCPServerParams ();

Когда я использую Valgring, я получаю определенную утечку памяти: 1271 == 00: 00: 01: 37.131 48682 == в 0x4C2903F: оператор новый (длинный без знака) (в /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so )

в строке: Poco :: Net :: TCPServerParams * pParams = новый Poco :: Net :: TCPServerParams ();

Версия Poco: dpkg -l | Греп Поко ii libpoco-dev 1.6.1-AVA3 amd64 C ++ Переносимые компоненты (POCO) Файлы разработки ii libpoconet31 1.6.1-AVA3 amd64 C ++ Переносимые компоненты (POCO) Сетевая библиотека

Чтобы исправить это, я использовал delete на указателе, но получаю ошибку

delete pParams

'TCPServerParams.h: 98: 10: ошибка: ‘virtual Poco :: Net :: TCPServerParams :: ~ TCPServerParams ()' защищен '

1 Ответ

0 голосов
/ 23 мая 2019

Обычный способ использования TCPServerParams заключается в том, что он работает вместе с TCPServer. Сначала вы создаете TCPServerParams с помощью new, затем оно передается в TCPServer, который становится владельцем параметров. Это описано в справке TCPServer .

Сервер также становится владельцем объекта TCPServerParams.

поэтому TCPServer удаляет экземпляр параметра там, где он не нужен.


Вы не можете удалить TCPServerParams вручную с помощью delete, потому что деструктор защищен.

В библиотеке Poco многие классы имеют защищенный деструктор, что заставляет вас использовать Poco::AutoPtr класс для управления временем жизни экземпляров.

TCPServerParams происходит от RefCountedObject. RefCountedObject обеспечивает механизм счетчика ссылок. У него есть метод release, который удаляет объект, когда заканчивается время жизни AutoPtr.

Чтобы вы могли написать:

Poco::AutoPtr<Poco::Net::TCPServerParams> p(new Poco::Net::TCPServerParams());

и память освобождается автоматически AutoPtr.

...