增强智能指针会帮助我吗?

时间:2010-07-09 12:51:13

标签: c++ boost

我正在使用Xerces做一些xml写作。

这是从我的代码中提取的几行:

DOMLSSerializer *serializer = ((DOMImplementationLS*)implementation)->createLSSerializer();
serializer->release();

是否有可以使用的升压智能指针,因此我可以避免调用serializer-> release();因为它不是例外安全。我看到的问题是智能指针只能调用指针对象上的delete,是否可以自定义来调用release?

感谢

4 个答案:

答案 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
}