sha*_*oth 6 c++ error-handling memory-management visual-c++
C++程序可以定义和设置new_handler()应该从内存分配函数调用的函数,就好像operator new()它不可能分配请求的内存一样.
自定义的一个用途new_handler()是处理不会在分配失败时抛出异常的C++实现.另一个用途是在实现垃圾收集的系统上启动垃圾收集.
有什么其他用途的习惯new_handler()吗?
与垃圾收集应用程序类似,您可以使用新的处理程序释放您可能保留的任何缓存数据.
假设您正在缓存从磁盘读取的一些资源数据或某些计算的中间结果.这是您可以随时重新创建的数据,因此当调用新处理程序(表示您已用完堆)时,您可以释放缓存数据的内存,然后从新处理程序返回.希望new现在能够进行分配.
在许多情况下,虚拟内存可以起到同样的作用:如果你有足够的虚拟地址空间,你可以简单地让你的缓存数据换成磁盘.在32位系统上,实际情况并非如此,因此新处理程序是一个有趣的选项.许多嵌入式系统将面临类似的限制.
在我工作的大多数服务器上,new_handler在记录消息(记录器使用动态内存)和中止之前释放了预分配的块(因此未来新的不会失败).这确保了正确记录了内存不足错误(而不是过程只是"消失",并显示一条cerr连接到的错误消息/dev/null).
在编辑器等应用程序中,有可能将部分缓冲区的部分溢出到磁盘,然后继续; 如果new_handler返回,operator new应该重试分配,如果new_handler释放了足够的内存,分配可能会成功(如果没有,则new_handler将再次被调用,可能会释放更多) .
| 归档时间: | 
 | 
| 查看次数: | 519 次 | 
| 最近记录: |