2011-01-10 80 views
1

我相信新的共享指針,並想知道如何initalize共享指針如果它也是一個成員變量?C++的Xerces-C:初始化一個shared_ptr

目前我的代碼看起來是這樣的: 在頭文件中,我有:

class Parser { 
    public: 
     Parser(); 
     ~Parser(); 

     boost::shared_ptr<XercesDOMParser> parser; 
{ 

在構造函數中,我有這樣的事情:

Parser::Parser() 
{ 
    try { 
     XMLPlatformUtils::Initialize(); 
    } catch (...) {} 

    parser = shared_ptr<XercesDOMParser> (new XercesDomParser()); 
} 

在析構函數中我有:

Parser::~Parser() { 
    try { 
     XMLPlatformUtils::Terminate(); 
    }catch(...) {} 
} 

但是編譯具有Valgrind的程序,我會接收地e出現以下錯誤: 調用純虛方法。 終止時沒有活動的異常。 大小爲8

任何見解我可以與初始化錯誤做的無效讀?

我懷疑是我從未分配的內存中讀取。

編輯:

所以在析構函數,我添加下面的代碼行終止命令和內存泄漏和錯誤全部消失之前!

如果(解析器) parser.reset();

爲什麼所有參考解析器想要離去,可以釋放之前?

非常感謝,謝謝。

+0

你確定這個問題是局部shared_ptr的intialization?你確定Valgrind錯誤是在這個函數中嗎?你能否提供一些關於虛擬函數被調用的更多細節?您提供的細節越多,我們就可以提供幫助。 – templatetypedef 2011-01-10 22:40:31

回答

2

要調用XMLPlatformUtils ::終止()呼籲XercesDomParser析構函數之前。析構函數體運行後調用成員變量的析構函數。成員變量按聲明的順序構造,並相反銷燬。

你可以做這樣的事情:

class Parser : boost::noncopyable { 
    struct XmlHandle { 
     XmlHandle() { XMLPlatformUtils::Initialize(); } 
     ~XmlHandle() { XMLPlatformUtils::Terminate(); } 
    }; 

    XmlHandle m_handle; 
    boost::shared_ptr<XercesDOMParser> m_parser; 

public: 
    Parser() : m_parser(new XercesDomParser) { } 
}; 

,只是使用默認的析構函數。如果你想複製構造函數和賦值操作符,你需要處理它。

哦,擒拿扔掉異常可能是一個糟糕的主意......