我需要解析一些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)我也使用一些smartpointer作为类成员。
像这样:

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


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

谢谢。

最佳答案

那会很好的。从函数返回智能指针时,结果将在临时变量销毁之前存储,因此,只要在调用create_element时将其存储在CComPtr<IXMLDOMElement>中,您将获得所需的结果(例如,CComPtr<IXMLDOMElement> resElem = create_element(...);。经过优化的C ++将很有可能甚至不会为临时对象所困扰,只需在resElem方法中使用element而不是create_element()即可加快流程(有关详细信息,请参见Google返回值优化)。

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

关于c++ - C++,MSXML和智能指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11942557/

10-09 20:01