这是Stroustup的书第3版,第362页的摘录:
原则上,抛出异常时会复制异常,因此处理程序会获取原始异常的副本.实际上,异常可能会在被捕获之前被复制多次.因此,我们不能抛出无法复制的异常.实施可以应用各种用于存储和传输异常的策略.但是,保证有足够的内存允许new抛出标准的outofmemory异常bad_alloc.
这意味着如果你的内存不足并且调用new()会抛出一个std :: bad_alloc,那么将会保留一些内存来创建,并生成std :: bad_alloc对象的正确拷贝数而不抛出另一个std :: bad_alloc是抛出异常的过程的结果.
通常,当您throw遇到异常时,这是一个两步过程:
该标准保证的情况下,没有再提供给您的任何内存,系统仍然有足够的可用内存来能够throw一个std::bad_alloc例外.
有几种策略可供选择:
通常,运行时会留出一些空间来复制异常,而不会实际执行内存分配.所以重新使用这个空间是相当普遍的.