在Effective C++ 3/E中,我读到:
这是异常不安全的代码:
class Test { };
void foo(const std::shared_ptr<Test> &ptr, int i);
int bar();
...
foo(std::shared_ptr<Test>(new Test), bar());
因为编译器可以这样实现:
- 跑
new Test
- call
bar()
<--如果bar()
抛出异常,Test
分配者的对象new Test
不能被删除。- 调用构造函数
std::shared_ptr<Test>
- 称呼
foo()
但是在这种情况下,编译器可以知道存在内存泄漏。delete
如果抛出异常,编译器不能自动执行吗?
此外,delete
在这种情况下,编译器会自动执行:
Test *p = new Test;
是这样实现的:
- 调用
operator new
分配内存- 调用构造函数
Test
。如果构造函数抛出异常,内存会被自动删除。
为什么编译器在第一种情况下不做,不像第二种情况?