如何修复 poco Poco::Net::TCPServerParams() valgrind 明确泄漏

How to fix poco Poco::Net::TCPServerParams() valgrind definite leak

我正在使用 Poco,我正在创建 TCP 服务器参数,如下所示: Poco::Net::TCPServerParams *pParams = new Poco::Net::TCPServerParams();

当我使用 Valgring 时,我确实发生了内存泄漏: 1271 ==00:00:01:37.131 48682== at 0x4C2903F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so )

行:Poco::Net::TCPServerParams *pParams = new Poco::Net::TCPServerParams();

Poco 版本: dpkg -l | grep poco 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: error: ‘virtual Poco::Net::TCPServerParams::~TCPServerParams()’ is protected'

使用 TCPServerParams 的一种常见方法是它与 TCPServer 一起使用。首先,您通过 new 创建 TCPServerParams,然后将其传递给 TCPServer,后者获得了参数的所有权。它在 reference of TCPServer.

中有描述

The server also takes ownership of the TCPServerParams object.

所以TCPServer删除不需要的参数实例。


您不能通过delete手动删除TCPServerParams,因为析构函数受到保护。

在 Poco 库中,许多 classes 都有保护析构函数,它迫使您使用 Poco::AutoPtr class 来管理实例的生命周期。

TCPServerParams 派生自 RefCountedObjectRefCountedObject 提供引用计数器机制。它有 release 方法,当 AutoPtr 的生命周期结束时删除一个对象。

所以你可以这样写:

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

内存由AutoPtr自动释放。