Share via


_set_new_handler

为错误处理机制传输控件,如果 new 运算符不能分配内存。

_PNH _set_new_handler(
   _PNH pNewHandler 
);

参数

  • pNewHandler
    处理功能的由应用程序提供的内存的指针。 会创建新的处理程序中移除参数 0。

返回值

返回指向 _set_new_handler签入以前的异常处理功能,因此,可在以后恢复前面的功能。 如果以前功能未设置,则返回值可用于还原默认行为;该值可以是 NULL。

备注

C++ _set_new_handler 功能指定在控件的异常处理的功能,如果 new 运算符不能分配内存。 如果 new 失败,则运行时系统自动调用将作为参数传递 _set_new_handler的异常处理的功能。 _PNH,定义在 New.h,是指向返回类型 int 并采用类型 size_t的参数。 使用 size_t 指定要分发的空间量。

没有默认的处理程序。

_set_new_handler 实质上是垃圾回收模式。 该运行时系统重试分配,每次函数返回非零值但失败,如果该函数返回 0。

_set_new_handler 功能的匹配项中的指定该异常处理的参数列表的函数与运行时系统的程序注册的:

#include <new.h>
int handle_program_memory_depletion( size_t )
{
   // Your code
}
int main( void )
{
   _set_new_handler( handle_program_memory_depletion );
   int *pi = new int[BIG_NUMBER];
}

您可以保存最后一传递给 _set_new_handler 函数的地址和之后恢复它:

_PNH old_handler = _set_new_handler( my_handler );
   // Code that requires my_handler
   _set_new_handler( old_handler )
   // Code that requires old_handler

C++ _set_new_mode 功能集 malloc的新处理程序模式。 新的处理程序模式指示,在失败时, malloc 是否调用新的处理程序实例由设置由 _set_new_handler。 默认情况下, malloc 不调用在发生故障的新处理程序实例分配内存。 可以重写此默认行为,以便,那么,当 malloc 不能分配内存时, malloc 类似的方式调用新的处理程序实例 new 运算符,则它的原因相同失败。 若要重写默认值,请调用:

_set_new_mode(1)

早期程序或指向与 Newmode.obj。

如果提供用户定义的 operator new,新的处理程序函数不是自动对失败。

有关更多信息,请参见 删除C++ 语言参考

具有全部动态链接到的 DLL 或可执行文件的单个 _set_new_handler 处理程序;即使您调用 _set_new_handler 处理程序中的其他替换或所替换可执行一的处理程序设置由另一个 DLL 或。

要求

实例

必需的头

_set_new_handler

new.h

有关更多兼容性信息,请参见中介绍的 兼容性

示例

在此示例中,那么,当分配失败时,控件传输到 MyNewHandler。 传递给 MyNewHandler 为请求的字节数。 从 MyNewHandler 返回的值是指示是否的标志应重试分配:非零值指示应重试分配,并且,零值指示分配失败。

// crt_set_new_handler.cpp
// compile with: /c
#include <stdio.h>
#include <new.h>
#define BIG_NUMBER 0x1fffffff

int coalesced = 0;

int CoalesceHeap()
{
   coalesced = 1;  // Flag RecurseAlloc to stop 
   // do some work to free memory
   return 0;
}
// Define a function to be called if new fails to allocate memory.
int MyNewHandler( size_t size )
{
   printf("Allocation failed. Coalescing heap.\n");

   // Call a function to recover some heap space.
   return CoalesceHeap();
}

int RecurseAlloc() {
   int *pi = new int[BIG_NUMBER];
   if (!coalesced)
      RecurseAlloc();
   return 0;
}

int main()
{
   // Set the failure handler for new to be MyNewHandler.
   _set_new_handler( MyNewHandler );
   RecurseAlloc();
}
          

.NET Framework 等效项

不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例

请参见

参考

内存分配

calloc

free

realloc