使模板函数与lvalue和rvalues指针参数一起使用

时间:2017-04-12 13:52:54

标签: c++11 templates

我的项目目前有内存泄漏。为了解决内存泄漏问题,我试图将指针替换为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。

1 个答案:

答案 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的意思是当你得到指针时立即将指针包装在其中。因此,不要将其存储在变量中。