在CTOR和智能指针中抛出异常

时间:2010-06-09 10:44:54

标签: c++ constructor smart-pointers raii

在构造函数中使用以下代码将XML文档加载到成员变量中是否可以 - 如果有任何问题则抛给调用者:

   MSXML2::IXMLDOMDocumentPtr m_docPtr; //member


Configuration()
{
    try
    {                      
        HRESULT hr = m_docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40));     

         if ( SUCCEEDED(hr))
         {
            m_docPtr->loadXML(CreateXML());
         }
         else
         {
            throw MyException("Could not create instance of Dom");
          }
    }
    catch(...)
    {
         LogError("Exception when loading xml");
         throw;
    }

}

基于Scott Myers RAII在更有效的C ++中的实现,如果他分配任何资源,即指针,他就会进行清理:

BookEntry::BookEntry(const string& name,
                 const string& address,
                 const string& imageFileName,
                 const string& audioClipFileName)
: theName(name), theAddress(address),
  theImage(0), theAudioClip(0)
{
  try {                            // this try block is new
    if (imageFileName != "") {
      theImage = new Image(imageFileName);
    }

  if (audioClipFileName != "") {
      theAudioClip = new AudioClip(audioClipFileName);
    }
  }
  catch (...) {                      // catch any exception


    delete theImage;                 // perform necessary
    delete theAudioClip;             // cleanup actions


    throw;                           // propagate the exception
  }
}

我相信我只是允许从CTOR抛出异常,因为我正在使用智能指针(IXMLDOMDocumentPtr)。

让我知道你的想法......

2 个答案:

答案 0 :(得分:1)

C ++保证在异常的情况下,所有完全构造的对象都将被销毁。

由于m_docPtrclass Configuration的成员,它将在class Configuration构造函数体开始之前完全构造,因此如果您从class Configuration身体抛出异常第一个代码段m_docPtr中的内容将被销毁。

答案 1 :(得分:0)

你打算在catch区块做任何事吗?如果没有,你可能不需要try catch。在Windows上,我相信catch(...)捕获硬件中断(专家请更正),请记住这一点。