2010-07-09 28 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