C++11 使模板函数同时使用左值和右值指针参数

C++11 使模板函数同时使用左值和右值指针参数,c++11,templates,C++11,Templates,目前我的项目中存在内存泄漏。为了解决内存泄漏问题,我尝试将指针替换为std::unique\u ptr。指向堆的指针不是来自我的项目,而是来自一个名为Xerces的库(一个XML解析库)。 在这个库中,它可以用两种方式将char*转换为XMLCh*。 所以在实际代码中,它就像 XMLCh * xmlstr = XMLString::transcode("abc",...); char * charstr = XMLString::transcode(xmlstr,...); 因为这两个方法都分

目前我的项目中存在内存泄漏。为了解决内存泄漏问题,我尝试将指针替换为
std::unique\u ptr
。指向堆的指针不是来自我的项目,而是来自一个名为Xerces的库(一个XML解析库)。 在这个库中,它可以用两种方式将char*转换为XMLCh*。 所以在实际代码中,它就像

XMLCh * xmlstr = XMLString::transcode("abc",...);
char * charstr = XMLString::transcode(xmlstr,...);
因为这两个方法都分配堆区域并返回其指针,所以我应该显式调用

XMLString::release(xmlstr);
XMLString::release(charstr);
用它来清理之后。我想使用std::unique\u ptr为两种类型(char*和XMLCh*)编写一个自定义删除程序

release方法有一个

XMLString::release(char **str);
XMLString::release(XMLCh **str);
它使用双指针,因为它在释放后将指针设置为null。 我想让模板接受这样的引用指针

template<typename T>
void release(T *& ptr){
    XMLString::release(ptr);
}
模板
无效释放(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",...));
XMLCh*xmlstr=XMLString::transcode(“abc”,…);
自动uptr=唯一的ptr(xmlstr)
这样做,但不可能做到

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",...));
auto-xmluptr=unique_ptr(XMLString::transcode(“abc”),…);
执行类似操作,因为它接受参数中的右值,但参数是引用指针。是否可以通过只编写一个模板函数来实例化这两种情况?
顺便说一下,我正在使用c++11

因此,如果我理解正确,您的问题是
XMLString::release
使用指向点的指针,它不适合
unique_ptr
release函数。好吧,正确的解决办法是像这样包装它

template<typename T>
void release(T *ptr){
    XMLString::release(&ptr);
}
模板
无效释放(T*ptr){
XMLString::发布(&ptr);
}
XMLString::release
只会清空包装器中指针的副本,但由于
unique\u ptr
会使自身无法使用,因此不需要
XMLString::release
的功能

在任何一种情况下,
release
包装的类型都不会影响
unique\u ptr
的构造方式,因为
release
包装将以
unique\u ptr
的内部成员作为参数调用。所以要么
unique\u ptr
接受该参数,两个赋值都会起作用,要么
unique\u ptr
不会接受,也不会


这就是说,unique_ptr的要点是,当您得到指针时,立即将其包装在其中。所以之前不要将其存储在变量中。

因此,如果我理解正确,您的问题是
XMLString::release
使用指向点的指针,并且它不适合
unique\u ptr
release函数。好吧,正确的解决办法是像这样包装它

template<typename T>
void release(T *ptr){
    XMLString::release(&ptr);
}
模板
无效释放(T*ptr){
XMLString::发布(&ptr);
}
XMLString::release
只会清空包装器中指针的副本,但由于
unique\u ptr
会使自身无法使用,因此不需要
XMLString::release
的功能

在任何一种情况下,
release
包装的类型都不会影响
unique\u ptr
的构造方式,因为
release
包装将以
unique\u ptr
的内部成员作为参数调用。所以要么
unique\u ptr
接受该参数,两个赋值都会起作用,要么
unique\u ptr
不会接受,也不会


这就是说,unique_ptr的要点是,当您得到指针时,立即将其包装在其中。所以之前不要将其存储在变量中。

您创建一个
std::unique_ptr
对象,并尝试使用该对象初始化
XMLCh*
变量。这当然行不通。除此之外,它看起来还不错。@Someprogrammerdude,对不起,我在代码中输入了一个o型。我编辑了最后一部分。问题是它接受引用作为参数,但从XMLString::transcode返回的指针实际上是一个r值指针。我所说的“工作”是指在释放后将指针分配给null,这是XMLString::release()的意图;
XMLString::transcode
的原型是什么?它是否返回一个普通指针?然后它可以直接用于构建
唯一的\u ptr
。真的没有“r值指针”这样的东西。如果函数返回一个指针,它将返回一个简单的指针。如果你尝试,你会遇到什么问题?你会犯什么错误?您可能正在返回一个指向局部变量的指针吗?另外,如果您使用
unique\u ptr
,那么实际上没有理由“在发布后将指针指定为null”。您可以创建一个
std::unique\u ptr
对象,并尝试使用该对象初始化
XMLCh*
变量。这当然行不通。除此之外,它看起来还不错。@Someprogrammerdude,对不起,我在代码中输入了一个o型。我编辑了最后一部分。问题是它接受引用作为参数,但从XMLString::transcode返回的指针实际上是一个r值指针。我所说的“工作”是指在释放后将指针分配给null,这是XMLString::release()的意图;
XMLString::transcode
的原型是什么?它是否返回一个普通指针?然后它可以直接用于构建
唯一的\u ptr
。真的没有“r值指针”这样的东西。如果函数返回一个指针,它将返回一个简单的指针。如果你尝试,你会遇到什么问题?你会犯什么错误?您是否正在返回指向局部变量的指针?此外,如果您使用
unique\u ptr
,实际上没有理由“在发布后将指针指定为null”。