1

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

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

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 的读取无效。

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

我怀疑我正在从未分配的内存中读取。

编辑:

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

if (解析器) parser.reset();

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

非常感谢,谢谢。

4

1 回答 1

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

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

哦,捕获和丢弃异常可能是个坏主意......

于 2011-01-11T00:31:04.280 回答