rapidxml 没有泄漏
No leaks from 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->append_attribute(XMLDoc.allocate_attribute("version", VersionValue.c_str()));
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("encoding", EncodingValue.c_str()));
我打开了rapidxml代码,在allocate_attribute()里面我看到了它分配的内存
xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;
并且在 append_attribute()
内部将内存分配给它的成员变量。
xml_document
没有声明析构函数。那么它如何删除属性呢? 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 将继续持有指向它们的过时指针。
今天我试图从我的项目中查找内存泄漏然后我遇到了下面的示例代码
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()));
我打开了rapidxml代码,在allocate_attribute()里面我看到了它分配的内存
xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;
并且在 append_attribute()
内部将内存分配给它的成员变量。
xml_document
没有声明析构函数。那么它如何删除属性呢? 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 将继续持有指向它们的过时指针。