我正在使用Xerces做一些xml写作。
这是从我的代码中提取的几行:
DOMLSSerializer *serializer = ((DOMImplementationLS*)implementation)->createLSSerializer();
serializer->release();
是否有可以使用的升压智能指针,因此我可以避免调用serializer-> release();因为它不是例外安全。我看到的问题是智能指针只能调用指针对象上的delete,是否可以自定义来调用release?
感谢
答案 0 :(得分:8)
是的,智能指针可以调用自定义的“删除”功能对象。
#include <iostream>
#include <tr1/memory>
struct Example {
void release() { std::cout << "Example::release() called\n"; }
};
struct ExampleDeleter {
void operator()(Example* e) { e->release(); }
};
int main()
{
{
std::tr1::shared_ptr<Example> p ( new Example, ExampleDeleter() );
}
std::cout << " see?\n";
}
(同样适用于提升:请参阅shared_ptr(Y * p, D d);构造函数。)
答案 1 :(得分:3)
是的,boost::shared_ptr
可以与自定义删除器仿函数(如Cubbi所示)或删除函数一起使用:
void my_deleter(DOMLSSerializer* s) {
s->release();
}
// ...
boost::shared_ptr<DOMLSSerializer> serializer(foo->createLSSerializer(), my_deleter);
答案 2 :(得分:2)
不知道为什么人们会以这种方式编写自己的包装器@Cubbi
回答make shared ptr not use delete
shared_ptr<DOMLSSerializer> serializer(
((DOMImplementationLS*)implementation)->createLSSerializer(),
std::mem_fun(&DOMLSSerializer::release) );
答案 3 :(得分:0)
如果您只需要一个小RAII课程,那么您可以自己编写辅助课程。它太小了,几乎没有拉自己的重量(更不用说拉动图书馆了):
class DOMLSSerializerOwner {
public:
DOMLSSSerializerOwner( DOMLSSerializer *serializer ) : m_serializer( serializer ) { }
~DOMLSSerializerOwner() { m_serializer->release(); }
operator DOMLSSerializer*() { return m_serializer; }
private:
DOMLSSerializerOwner( const DOMLSSerializerOwner &other ); // disabled
void operator=( const DOMLSSerializerOwner &rhs ); // disabled
DOMLSSerializer *m_serializer;
};
然后你可以阅读你的代码:
void f()
{
DOMLSSerializerOwner serializer = ((DOMImplementationLS*)implementation)->createLSSerializer();
serializer->doThis();
serializer->doThis();
// Look Ma: no release() call; 'serializer' does it automatically when going out of scope
}