在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。如果构造函数抛出异常,内存会被自动删除。
为什么编译器在第一种情况下不做,不像第二种情况?