我是共享指针的新手,并且想知道如果它也是一个成员变量,如何初始化共享指针?
目前我的代码看起来像这样: 在头文件中,我有:
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();
为什么所有对解析器的引用都必须在解除分配之前消失?
非常感谢,谢谢。
答案 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) { }
};
只需使用默认的析构函数。如果你想要复制构造函数和赋值运算符,你需要处理它。
哦,抓住并抛弃异常可能是一个坏主意......