C++ c++;,msxml和智能指针

C++ c++;,msxml和智能指针,c++,visual-c++,smart-pointers,msxml,C++,Visual C++,Smart Pointers,Msxml,我需要解析一些XML并编写一些帮助程序。我不是C++专家,实际上我在七年前用C写的。因此,我想确定,我使用的方法是否正确:) 1) 我实现了一些简单的助手,以处理异常。 例如: CComPtr<IXMLDOMElement> create_element(CComPtr<IXMLDOMDocument> xml_doc, string element_name) { CComPtr<IXMLDOMElement> element; HRESU

我需要解析一些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;
}
CComPtr创建元素(CComPtr xml\u文档,字符串元素\u名称){
CComPtr元素;
HRESULT hr=xml\u doc->createElement((BSTR)element\u name.c\u str(),&element);
如果(失败(小时))
hr_raise(“未能创建XML元素“”+元素名称+”,hr);
返回元素;
}
然后像这样使用它:

void SomeClass::SomeMethod() {
    CComPtr<IXMLDOMElement> element = xmlh::create_element(xml_doc, "test");
    //..
    // save xml to file
}
void SomeClass::SomeMethod(){
CComPtr元素=xmlh::创建元素(xml文档,“test”);
//..
//将xml保存到文件
}
可以吗?我的意思是我可以返回智能指针作为函数结果吗?这种方法没有泄漏吗

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
classxmlcommand{
公众:
XMLCommand(std::string str_xml);
~XMLCommand(void);
受保护的:
CComPtr xml_doc;
}
XMLCommand::XMLCommand(字符串str_xml){
xml_doc=xmlh::create_xml_doc();
}
//下面的一些方法使用xml\u doc
问题是相同的,它是否正确且没有泄漏


谢谢。

那很好。从函数返回智能指针时,结果将在销毁临时变量之前存储,因此只要在调用create_元素时将其存储在
CComPtr
中,您将获得所需的结果(例如,
CComPtr resElem=create_元素(…)优化的C++将很可能不为临时性的问题而烦恼,只使用<代码> ReeleMe>代码>代替<代码>元素>代码> >代码> >代码>方法,加快进程(谷歌返回值优化的细节)。

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

非常感谢。我不考虑优化,它非常简单使用高负载第三方API的e控制台应用程序。因此客户端部分的简单代码对我来说更重要,因为它的速度。事实上,我对赋值结果表示怀疑。我担心CComptr会创建一个对象,函数结果会重写它,第一个对象会泄漏。值得关注的是,仅仅创建一个智能指针不会创建一个实例对象的e大于
Shape*pShape;
将创建一个
Shape
对象。更重要的是,当您调用
CComPtr resElem=create_元素(…);
,您不是先创建一个CComPtr,然后使用
操作符=
初始化它,而是实际使用该类型的复制构造函数来构造
CComPtr
!因此,即使出于某些疯狂的原因,
CComPtr
的默认构造函数实例化了一个对象,在这种情况下,您甚至都没有调用default构造函数。
HRESULT hr=xml\u doc->createElement((BSTR)element\u name.c\u str(),&element);
=>
(BSTR)element\u name.c\u str()
对我来说很可疑。
BSTR
基于带长度前缀的
WCHAR
,而
element\u name
字符串,通常使用
char
。。