首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++、msxml和智能指针

c++、msxml和智能指针
EN

Stack Overflow用户
提问于 2012-08-14 05:26:12
回答 1查看 629关注 0票数 0

我需要解析一些XML,并编写了一些助手。我不是C++方面的专家,实际上我是七年前用c写的。因此,我要确保我使用的方法是正确的还是错误的:)

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

代码语言:javascript
复制
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;
}

并像这样使用它:

代码语言:javascript
复制
void SomeClass::SomeMethod() {
    CComPtr<IXMLDOMElement> element = xmlh::create_element(xml_doc, "test");
    //..
    // save xml to file
}

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

2)我还使用了一些智能指针作为类成员。如下所示:

代码语言:javascript
复制
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

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-14 05:34:28

这将工作得很好。当从function返回一个智能指针时,结果在临时库被析构之前被存储,所以只要你在调用create_element时把它存储在CComPtr<IXMLDOMElement>中,你就会得到想要的结果(例如,CComPtr<IXMLDOMElement> resElem = create_element(...);。优化的C++很可能甚至不会为时态之类的东西而烦恼,只需在你的create_element()方法中使用resElem而不是element,从而加快了这个过程(谷歌返回值优化获取详细信息)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11942557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档