视觉 除了垃圾回收之外,"new_handler"还可以用于C++什么?

visual What can "new_handler" be used for in C++ besides garbage collection?

本文关键字:handler new 还可以 用于 什么 C++ 视觉      更新时间:2023-10-16

C++程序可以定义和设置一个new_handler(),如果无法分配请求的内存,则应从内存分配函数(如operator new()(调用该。

自定义new_handler()的一种用途是处理不会在分配失败时引发异常的C++实现。另一个用途是在实现垃圾回收的系统上启动垃圾回收。

自定义new_handler()还有哪些其他用途?

与垃圾回收应用程序类似,您可以使用新的处理程序来释放您可能保留的任何缓存数据。

假设您正在缓存从磁盘读取的某些资源数据或某些计算的中间结果。这是您可以随时重新创建的数据,因此当调用新处理程序(表示堆已用完(时,您可以释放缓存数据的内存,然后从新处理程序返回。希望new现在能够进行分配。

在许多情况下,虚拟

内存可以达到相同的目的:如果您有足够的虚拟地址空间,您可以简单地将缓存的数据交换到磁盘。在 32 位系统上,情况不再如此,因此新的处理程序是一个有趣的选择。许多嵌入式系统将面临类似的限制。

在我工作过的大多数服务器上,new_handler被释放之前预分配的块(因此将来的新块不会失败(记录消息(记录器使用动态内存(并中止。这可确保正确记录内存不足错误(而不是过程只是"消失",并带有错误给cerr的消息,它连接到/dev/null(。

在编辑器等应用程序中,可以将某些缓冲区的部分溢出到磁盘,然后继续;如果new_handler返回,运算符 new 应该重试分配,如果new_handler释放了足够的内存,分配可能会成功(如果没有成功,则new_handler将再次被召唤,也许可以释放更多(。

我从来没有用过它做任何事情 - 太多的操作系统会授予虚拟内存和SIGSEGV或类似的东西,如果他们以后不能提供它,所以建立一个依赖于内存耗尽容忍的系统不是一个好主意:它通常在C++的手中。 不过,如果您为可以/必须依赖的系统开发,我可以很容易地想象这样一种情况:一些实时数据在您的过程中被流式传输到队列中,并且您正在处理它并尽可能快地写入/发送结果(例如,视频硬件流式传输视频以重新压缩到磁盘/网络(。 如果你到了无法再存储的阶段,你只需要放弃一些,但你怎么知道它什么时候变得那么糟糕? 设置任意限制会有点愚蠢,特别是如果您的软件用于仅用于执行此任务的嵌入式环境/盒子。 而且,您可能不应该在具有任何类型的基于硬盘的交换内存的系统上随便使用这样的功能,因为如果您已经进入交换,那么您的吞吐率将从此变得悲惨。 但是 - 除了警告之外 - 丢弃数据包一段时间直到您赶上可能会很有用。 也许通过排队的缓冲区删除每 N 帧比在队列的后面或前面删除一个块更不明显。 无论如何,从队列中丢弃数据可能是理智的应用程序级使用(与内存内子系统不同(,对于这样的事情......