C ++ Xerces-c:初始化shared_ptr

时间:2011-01-10 22:35:11

标签: c++ shared-ptr xerces-c

我是共享指针的新手,并且想知道如果它也是一个成员变量,如何初始化共享指针?

目前我的代码看起来像这样: 在头文件中,我有:

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编译程序,我都会收到以下错误: 称为纯虚方法。 在没有活动异常的情况下终止。 读取大小为8。

对初始化时我可能做错了什么的任何见解?

我的怀疑是我正在阅读未分配的记忆。

编辑:

所以在析构函数中,我在terminate命令之前添加了以下代码行,内存泄漏和错误都消失了!

if(parser)     parser.reset();

为什么所有对解析器的引用都必须在解除分配之前消失?

非常感谢,谢谢。

1 个答案:

答案 0 :(得分:2)

在调用XercesDomParser的析构函数之前,您正在调用XMLPlatformUtils :: Terminate()。析构函数体运行后调用成员变量的析构函数。成员变量按声明顺序构造,并反向销毁。

你可以这样做:

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) { }
};

只需使用默认的析构函数。如果你想要复制构造函数和赋值运算符,你需要处理它。

哦,抓住并抛弃异常可能是一个坏主意......