代码之家  ›  专栏  ›  技术社区  ›  dangerousdave

一个助推智能指针能帮助我吗?

  •  2
  • dangerousdave  · 技术社区  · 14 年前

    我正在使用Xerces编写一些XML。

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

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

    是否有可以使用的Boost智能指针,以便避免调用序列化程序->release();因为它不是异常安全的。我看到的问题是,智能指针只能对指针对象调用delete,是否可以自定义为调用release?

    谢谢

    4 回复  |  直到 14 年前
        1
  •  8
  •   Cubbi    14 年前

    是的,智能指针可以调用自定义的“deleter”函数对象。

    #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); 构造函数。

        2
  •  3
  •   Georg Fritzsche    14 年前

    对, boost::shared_ptr 可以与自定义的deleter函数(如cubbi所示)或deleter函数一起使用:

    void my_deleter(DOMLSSerializer* s) {
        s->release();
    }
    
    // ...
    boost::shared_ptr<DOMLSSerializer> serializer(foo->createLSSerializer(), my_deleter);
    
        3
  •  2
  •   Community leo1    7 年前

    不知道为什么人们再这样写自己的包装纸了@cubbi

    正如回答 make shared ptr not use delete

    shared_ptr<DOMLSSerializer> serializer( 
      ((DOMImplementationLS*)implementation)->createLSSerializer(), 
      std::mem_fun(&DOMLSSerializer::release) );
    
        4
  •  0
  •   Frerich Raabe    14 年前

    如果你只需要一点点 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
    }