2010-07-09 79 views
2

我使用Xerces来做一些xml写作。智能指针会帮助我吗?

这里的一对夫妇从我的代码提取的行:

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

有,我可以使用升压智能指针,所以我能避免调用serializer->发布();因为它不是特别安全。我看到的问题是,智能指针只能调用指针对象上的删除操作,它是否可以自定义以调用释放?

谢谢

+0

因为它现在是异常安全的,如果你希望智能指针可以调用发行版本,那么智能指针如何提供帮助? – Patrick 2010-07-09 12:55:34

+0

对不起,我的意思是它不保存调用释放(),因为它可能不会在抛出异常时调用。 – dangerousdave 2010-07-09 13:03:15

回答

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

+0

@Greg Domjan对'mem_fun'的回答实际上对于像这样的简单情况更好。 – Cubbi 2010-07-09 20:03:36

3

是,boost::shared_ptr可以用定制删除算符(如图Cubbi)或删除器功能可以使用:

void my_deleter(DOMLSSerializer* s) { 
    s->release(); 
} 

// ... 
boost::shared_ptr<DOMLSSerializer> serializer(foo->createLSSerializer(), my_deleter); 
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 
} 
+1

'operator T *'是不够的,你至少需要'operator->'。隐式转换并不总是受欢迎的,指针值的明确getter更好。 – 2010-07-09 13:15:04

2

不知道为什么人写自己的自己的包装这种方式更多的@Cubbi

,如果你不想调用release b没有回答到make shared ptr not use delete

shared_ptr<DOMLSSerializer> serializer( 
    ((DOMImplementationLS*)implementation)->createLSSerializer(), 
    std::mem_fun(&DOMLSSerializer::release)); 
+0

你说得对,但它不是'std :: mem_fun',因为它会被一个指针调用?在我的例子中,'shared_ptr p(新的例子,std :: mem_fun(&Example :: release));'works和'... mem_fun_ref ...'不能编译。 – Cubbi 2010-07-09 17:48:25

+0

非常正确,感谢您的纠正。 – 2010-07-09 18:27:38