我有一个原始指针的案例,我无法将其更改为智能指针,因为它是接口的一部分(并且我不想使用它破坏任何代码):
struct Foo
{
Foo();
~Foo();
int * m_pStuff; // public!
};
我不想在我的ctor中做太多事情。就像:
m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
然后在析构函数中删除它。
现在,我想知道是否真的值得用 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;
}
}
我可以反对的观点:
- 更复杂的代码
- 真的不希望那里发生任何异常(除非它在分配时空间不足)
- 并不是真的期望代码会改变
我可以看到的要点:
- 向潜在的未来编码人员表明他们应该小心任何抛出异常并将其放在已经存在的 try 块中
- 如果确实发生任何异常,则会处理内存释放
我还没有决定:我应该用 try/catch 包围它吗?为什么?我想听听你对此的看法。
另外,除了分配时内存不足之外,您是否看到任何异常的可能性?在那种情况下,已经分配的内存会被自动回收,对吧?
谢谢!