视觉 除了垃圾回收之外,"new_handler"还可以用于C++什么?
visual What can "new_handler" be used for in C++ besides garbage collection?
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 帧比在队列的后面或前面删除一个块更不明显。 无论如何,从队列中丢弃数据可能是理智的应用程序级使用(与内存内子系统不同(,对于这样的事情......
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 重载运算符new[]的行为取决于析构函数
- 过载'operator new'如何导致无限循环?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- Codelite C++ new project
- 在类c++中使用new声明数组
- g++用户定义的动态链接库上的全局new和delete运算符
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 在将 new 与指针一起使用时,创建数组的指定长度
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 为什么我的全局 new() 覆盖被绕过了?
- 声明C++数组(带或不带 "new" 关键字)
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- constexpr new 如何分配内存?
- 放置 new 和 uninitialized_fill() 的行为
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- different between int **arr =new int [ n]; and int a[i][j]?
- 如果 new-handler 函数未正确编写或无法在 c++ 中释放更多内存,会发生什么情况