【问题标题】:will the following xerces code cause a memory leak?以下 xerces 代码会导致内存泄漏吗?
【发布时间】:2012-07-31 15:33:51
【问题描述】:

我查看了我在互联网上找到的 xerces 生成 XML 的示例。 Transcode 函数似乎执行了一些编码,但它填充的缓冲区从未被释放。根据文档,您必须手动释放 ti:

注意:返回的缓冲区是动态分配的,调用者有责任在不再需要时将其删除。你可以调用 XMLString::release 来释放这个返回的缓冲区。

doc->release 可以从内存中释放它吗?

    XMLCh tempStr[100];

    XMLString::transcode("Range", tempStr, 99);
    DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr, 0);

    XMLString::transcode("root", tempStr, 99);
    DOMDocument*   doc = impl->createDocument(0, tempStr, 0);
    DOMElement*   root = doc->getDocumentElement();

    XMLString::transcode("FirstElement", tempStr, 99);
    DOMElement*   e1 = doc->createElement(tempStr);
    root->appendChild(e1);

    XMLString::transcode("SecondElement", tempStr, 99);
    DOMElement*   e2 = doc->createElement(tempStr);
    root->appendChild(e2);
    doc->release();

【问题讨论】:

    标签: c++ xerces xerces-c


    【解决方案1】:

    如果我误解了,请原谅我,但您使用的 transcode 版本实际上并没有创建或返回任何缓冲区,因为它正在修改您提供的缓冲区 (tempStr) .您的示例代码不会泄漏内存。

    确实返回缓冲区的transcode 版本(例如,除示例代码块中的版本之外的所有其他版本)使用MemoryManager 实例来执行分配。这里的文档似乎有点稀疏,但据我所知,默认的XMLPlatformUtils::fgMemoryManager 没有声称要清理它分配的任何内存。因此,您应该假设您需要自己销毁返回的缓冲区。

    【讨论】:

      【解决方案2】:

      不,doc->release() 没有释放缓冲区。

      正如您引用的文档所说,如果您调用返回转码字符串的transcode 函数,您需要使用XMLString::release() 释放缓冲区:

      char *str = XMLString::transcode(someStringVarToBeTranscoded);
      XMLString::release(&str);
      

      您的示例不需要这样做,因为您使用的是返回 boolean 值的 transcode 函数。

      【讨论】:

      • 所以如果我在同一个缓冲区上调用 transcode 两次并且只调用 release 一次会导致内存泄漏吗?
      • @godzilla:不。在您的示例中,您无需担心释放缓冲区。您的缓冲区tempStr[100] 分配在堆栈 上。一旦此函数超出范围,缓冲区将被释放。
      • @godzilla:我也更新了我的答案以澄清一些事情。
      • Doug 最后一件事,关于 createTextNode 的文档也很少,它返回的 DOMText * 是否需要被释放或者 doc>release() 会为你做这件事吗?
      • @godzilla:来自documentation:“C++ DOM 实现提供了一个 release() 方法,用于释放通过 createXXXX 工厂方法创建的任何“孤立”资源。任何返回的内存对象归实现所有。"
      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2010-09-13
      • 2018-08-17
      相关资源
      最近更新 更多