gpt4 book ai didi

c++ - rapidxml 没有泄漏

转载 作者:行者123 更新时间:2023-11-30 05:02:54 27 4
gpt4 key购买 nike

今天我试图从我的项目中查找内存泄漏然后我遇到了下面的示例代码

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 将继续持有指向它们的陈旧指针。

关于c++ - rapidxml 没有泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49628558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com