我需要解析一些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/