0

我需要解析一些 XML 并编写一些帮助程序。我不是 C++ 专家,实际上我在七年前用 c 编写过。所以,我想确定,我使用的方法是正确的还是不正确的:)

1)我实现了一些简单的助手,以处理异常。例如:

CComPtr<IXMLDOMElement> create_element(CComPtr<IXMLDOMDocument> xml_doc, string element_name) {
    CComPtr<IXMLDOMElement> element;

    HRESULT hr = xml_doc->createElement((BSTR)element_name.c_str(), &element);

    if (FAILED(hr))
        hr_raise("Failed to create XML element '" + element_name + "'", hr);

    return element;
}

并像这样使用它:

void SomeClass::SomeMethod() {
    CComPtr<IXMLDOMElement> element = xmlh::create_element(xml_doc, "test");
    //..
    // save xml to file
}

可以吗?我的意思是我可以将智能指针作为函数结果返回吗?这种方法没有泄漏吗?

2)我也使用一些智能指针作为类成员。像这样:

class XMLCommand {
    public:
        XMLCommand(std::string str_xml);
        ~XMLCommand(void);
    protected:
        CComPtr<IXMLDOMDocument> xml_doc;
}


XMLCommand::XMLCommand(string str_xml) {
    xml_doc = xmlh::create_xml_doc();
}

// some methods below uses xml_doc

问题是一样的,它是否正确且没有泄漏?

谢谢。

4

1 回答 1

1

那会很好用。从函数返回智能指针时,结果会在临时对象被破坏之前存储,因此只要在CComPtr<IXMLDOMElement>调用 create_element 时将其存储在 a 中,您就会得到所需的结果(例如,CComPtr<IXMLDOMElement> resElem = create_element(...);优化的 C++ 很可能甚至不会打扰临时对象等等,resElem而不是element在你的create_element()方法中使用,加快进程(谷歌返回值优化细节)。

后一种情况几乎是教科书的智能指针用法。我想不出一个会失败的案例。但是,通常使用智能指针时的一个危险是要注意和/或避免循环依赖,这可能导致智能指针永远不会删除它们包含的对象。

于 2012-08-13T21:34:28.203 回答