我的项目目前有内存泄漏。为了解决内存泄漏问题,我试图将指针替换为std:: unique_ptr
。指向堆的指针不是来自我的项目,而是来自名为Xerces(XML解析库)的库。
在这个库中,它可以以两种方式将char *转码为XMLCh *。
所以在实际代码中,它就像......
XMLCh * xmlstr = XMLString::transcode("abc",...);
char * charstr = XMLString::transcode(xmlstr,...);
因为两个方法都分配了堆区域并为它返回指针,所以我应该显式调用
XMLString::release(xmlstr);
XMLString::release(charstr);
用它来清理之后。我想使用std :: unique_ptr为两种类型(char *和XMLCh *)编写自定义删除器。
发布方法的类型为
XMLString::release(char **str);
XMLString::release(XMLCh **str);
它使用双指针,因为它在释放后将指针设置为null。 我想让模板接受像这样的参考指针,
template<typename T>
void release(T *& ptr){
XMLString::release(ptr);
}
但只是意识到有可能
XMLCh * xmlstr = XMLString::transcode("abc",...);
auto uptr = unique_ptr<XMLCH, decltype(&release<T>)>(xmlstr)
这样做,但不可能
auto xmluptr = unique_ptr<XMLCH, decltype(&release<T>)>(XMLString::transcode("abc",...));
执行类似的操作,因为它接受参数中的右值,但参数是引用指针。是否可以实例化只写一个模板函数的两种情况? 顺便说一句,我使用的是c ++ 11。
答案 0 :(得分:2)
因此,如果我理解正确,那么您的问题是XMLString::release
采用指针指向点并且它不适合unique_ptr
释放函数。那么,正确的解决方案是将其包装成
template<typename T>
void release(T *ptr){
XMLString::release(&ptr);
}
XMLString::release
只会使包装器内指针的副本无效,但由于unique_ptr
负责使自身无法使用,因此您不需要{的功能{ {1}}。
在任何一种情况下,XMLString::release
包装器的类型不都会影响release
的构造方式,因为unique_ptr
包装器将被调用release
的内部成员作为参数。因此unique_ptr
接受该论点,两项作业都有效,或unique_ptr
不接受,也不接受。
那就是说,unique_ptr的意思是当你得到指针时立即将指针包装在其中。因此,不要将其存储在变量中。