我需要解析一些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问题是一样的,它是正确的并且没有泄漏吗?
谢谢。
发布于 2012-08-14 05:34:28
这将工作得很好。当从function返回一个智能指针时,结果在临时库被析构之前被存储,所以只要你在调用create_element时把它存储在CComPtr<IXMLDOMElement>中,你就会得到想要的结果(例如,CComPtr<IXMLDOMElement> resElem = create_element(...);。优化的C++很可能甚至不会为时态之类的东西而烦恼,只需在你的create_element()方法中使用resElem而不是element,从而加快了这个过程(谷歌返回值优化获取详细信息)。
后一种情况几乎是教科书上的智能指针用法。我想不出会失败的案例。不过,通常使用智能指针时的一个危险是要注意和/或避免循环依赖,这可能会导致智能指针永远不会删除其包含的对象。
https://stackoverflow.com/questions/11942557
复制相似问题