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

时间:2019-05-22 22:34:31

标签: c++ c++11 valgrind poco-libraries

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

当我使用Valgring时,会出现明确的内存泄漏:    1271 == 00:00:01:37.131 48682 ==在0x4C2903F:运算符new(unsigned long)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中 )

在线:Poco :: Net :: TCPServerParams * pParams =新的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:错误:“虚拟Poco :: Net :: TCPServerParams :: ~~ TCPServerParams()'受保护'

1 个答案:

答案 0 :(得分:0)

使用TCPServerParams的常见方法是与TCPServer一起使用。首先,您用TCPServerParams创建new,然后将其传递到TCPServer中,该参数拥有参数的所有权。在reference of TCPServer中有描述。

  

服务器还拥有TCPServerParams对象的所有权。

因此TCPServer删除不需要的参数实例。


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

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

TCPServerParams源自RefCountedObjectRefCountedObject提供了参考计数器机制。它具有release方法,可在AutoPtr的生存期结束时删除对象。

所以你可以这样写:

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

AutoPtr自动释放内存。