正文

回到顶部

1. 调用普通版本的operator new抛出异常会发生什么?

Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉。当你像下面这样实现一个new表达式的时候,回忆一下Item 16Item 17

1 Widget *pw = new Widget;

 

两个函数会被调用:一个是调用operator new来分配内存,第二个是Widget的默认构造函数。

假设第一个调用成功了,但是调用第二个函数抛出了异常。在这种情况下,对步骤一中执行的内存分配必须进行回滚。否则就会发生内存泄漏。客户端代码不能释放内存,因为如果Widget构造函数抛出了异常,pw永远不会赋值。客户端就没有办法得到指向需要释放内存的指针。对步骤一进行回滚的责任就落在了C++运行时系统身上。

运行时系统很高兴去调用与步骤1中调用的operator new版本相对应的operator delete,但是只有在它知道哪个operator delete(可能有许多)是合适的被调用函数的情况下才能做到。如果你正在处理的new和delete版本有着正常的签名,那么这不是一个问题,因为正常的operator new,

1 void* operator new(std::size_t) throw(std::bad_alloc);

 

网友评论