在内部构造函数中,使用/ catch块将简单的内存分配到公共​​原始指针中?

ric*_*cab 1 c++ constructor pointers exception dynamic-memory-allocation

我有一个带有原始指针的情况,我无法更改为智能指针,因为它是接口的一部分(我不想破坏使用它的任何代码):

struct Foo
{
  Foo();
  ~Foo();

  int * m_pStuff; // public!
};
Run Code Online (Sandbox Code Playgroud)

我不想在我的病人身上做太多事情.就像这样:

m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
Run Code Online (Sandbox Code Playgroud)

然后在析构函数中删除它.

现在,我想知道使用try/catch是否值得围绕它:

Foo::Foo()
  : m_pStuff(0)
{
  try
  {
    m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
    m_pStuff[0] = 0;
  } 
  catch(...)
  {
    delete m_pStuff;
    throw;
  }
}
Run Code Online (Sandbox Code Playgroud)

我能看到的观点:

  • 更复杂的代码
  • 并不是真的希望在那里发生任何异常(除非分配时空间不足)
  • 并不是真的希望代码能够改变

我能看到的要点:

  • 向潜在的未来编码者表明,他们应该小心处理任何抛出异常并将其放入已经存在的try块中
  • 如果发生任何异常,则会释放内存释放

我还是很犹豫:我是否应该尝试使用try/catch?为什么?我想就此提出你的意见.

此外,您是否看到在分配时由于内存不足而导致异常的可能性?在这种情况下,已经分配的内存将被自动回收,对吗?

谢谢!

Lig*_*ica 5

没有.

这完全没有意义.

int施工可能不会抛出,所以这里唯一可能的例外是std::bad_alloc.在这种情况下你在做什么?

  • 好吧,首先你要做delete一个NULL指针,这是一个无操作.分配失败,所以你不是"回收"任何东西.
  • 然后你重新抛出异常.

即恰恰是没有try/的情况catch.

只是让异常传播,并记录它是可能的.

但是,这个建议并不一定适用于其他类型.


另外,不要忘记您的复制构造函数.