Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ rapidxml无泄漏_C++_Rapidxml - Fatal编程技术网

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”属性字符串(在上面的代码中),所以它不会删除它,也不会知道它何时超出范围。