下面的最后一句粗体与复制抛出的异常有什么关系?

Bel*_*loc 8 c++ exception

这是Stroustup的书第3版,第362页的摘录:

原则上,抛出异常时会复制异常,因此处理程序会获取原始异常的副本.实际上,异常可能会在被捕获之前被复制多次.因此,我们不能抛出无法复制的异常.实施可以应用各种用于存储和传输异常的策略.但是,保证有足够的内存允许new抛出标准的outofmemory异常bad_alloc.

ala*_*nxz 9

这意味着如果你的内存不足并且调用new()会抛出一个std :: bad_alloc,那么将会保留一些内存来创建,并生成std :: bad_alloc对象的正确拷贝数而不抛出另一个std :: bad_alloc是抛出异常的过程的结果.


Mat*_* M. 6

通常,当您throw遇到异常时,这是一个两步过程:

  1. 异常是在堆栈上本地构建的
  2. 抛出异常,包括将副本存储在"某处"并销毁堆栈上的临时文件.

该标准保证的情况下,没有再提供给您的任何内存,系统仍然有足够的可用内存来能够throw一个std::bad_alloc例外.

有几种策略可供选择:

  • 只是在某处静态分配异常,然后"假"抛出它(只是传递对静态引用的引用)
  • 为异常保留一些空间(足够)
  • ...

通常,运行时会留出一些空间来复制异常,而不会实际执行内存分配.所以重新使用这个空间是相当普遍的.