C++ rapidxml无泄漏
今天我试图从我的项目中找到内存泄漏,然后我遇到了下面的示例代码C++ rapidxml无泄漏,c++,rapidxml,C++,Rapidxml,今天我试图从我的项目中找到内存泄漏,然后我遇到了下面的示例代码 std::string VersionValue("1.0"); std::string EncodingValue("UTF-8"); rapidxml::xml_document<> XMLDoc; rapidxml::xml_node<> * pHeaderNode = XMLDoc.allocate_node(rapidxml::node_declaration); pHeaderNode->
std::string VersionValue("1.0");
std::string EncodingValue("UTF-8");
rapidxml::xml_document<> XMLDoc;
rapidxml::xml_node<> * pHeaderNode = XMLDoc.allocate_node(rapidxml::node_declaration);
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("version", VersionValue.c_str()));
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("encoding", EncodingValue.c_str()));
std::string VersionValue(“1.0”);
std::字符串编码值(“UTF-8”);
rapidxml::xml_文档XMLDoc;
rapidxml::xml\u node*pHeaderNode=XMLDoc.allocate\u node(rapidxml::node\u声明);
pHeaderNode->append_属性(XMLDoc.allocate_属性(“version”,VersionValue.c_str());
pHeaderNode->append_属性(XMLDoc.allocate_属性(“encoding”,EncodingValue.c_str());
我打开rapidxml代码,在allocate_attribute()中我看到了它正在分配内存
xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;
xml\u属性*attribute=新的(内存)xml\u属性;
在append_attribute()
中,将内存分配给其成员变量。
没有为
xml\u文档
声明析构函数。那么如何删除属性呢?valgrind从上述示例代码返回0内存泄漏。这是怎么可能的?正如评论中提到的,新位置是答案
这种行为是rapidxml的主要优点之一,也是最常见的问题之一:它不复制作为参数传递的任何数据
例如,如果您的代码如下所示:-
rapidxml::xml_document<> XMLDoc;
rapidxml::xml_node<> * pHeaderNode =
XMLDoc.allocate_node(rapidxml::node_declaration);
{
std::string VersionValue("1.0");
std::string EncodingValue("UTF-8");
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("version", VersionValue.c_str()));
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("encoding", EncodingValue.c_str()))
}
rapidxml::xml\u文档XMLDoc;
rapidxml::xml_节点*pHeaderNode=
XMLDoc.allocate_node(rapidxml::node_声明);
{
标准::字符串版本值(“1.0”);
std::字符串编码值(“UTF-8”);
pHeaderNode->append_属性(XMLDoc.allocate_属性(“version”,VersionValue.c_str());
pHeaderNode->append_属性(XMLDoc.allocate_属性(“encoding”,EncodingValue.c_str()))
}
。。。然后您通常会遇到重大问题,因为属性字符串将超出范围,但rapidxml将继续保留指向它们的陈旧指针。@Joe new必须在某个时候删除,对吗?看起来这是一个新的位置
新(内存)
没有分配任何内容,但是使用*内存中已经存在的内存
。谢谢@Alexander我没有意识到新的位置当XMLDoc超出范围时xapidxml将清理内存池,或者在退出评分之前,我们必须调用clear()并清理内存池吗?有没有办法知道RapidXMl正在共享多少内存?RapidXMl内部分配的东西当然会清理干净。但请阅读手册中关于“字符串所有权”和“源文本的生存期”的部分。因为RapidXML不拥有“UTF-8”属性字符串(在上面的代码中),所以它不会删除它,也不会知道它何时超出范围。