gpt4 book ai didi

c++、msxml 和智能指针

转载 作者:行者123 更新时间:2023-11-28 07:59:13 27 4
gpt4 key购买 nike

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

同题,是否正确无漏?

谢谢。

最佳答案

那会很好用。从函数返回智能指针时,结果会在临时对象被破坏之前存储,所以只要将它存储在 CComPtr<IXMLDOMElement> 中即可。当您调用 create_element 时,您将获得所需的结果(例如 CComPtr<IXMLDOMElement> resElem = create_element(...); 。优化的 C++ 很可能甚至不会打扰临时对象等,只需在 resElem 方法中使用 element 而不是 create_element(),从而加快过程(谷歌返回值优化的详细信息)。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com