`
izuoyan
  • 浏览: 9222448 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

new_handler & set_new_handler

阅读更多

//the discriptions in msdn ,we can find this document in

//website:http://msdn.microsoft.com/library/default.asp?url=/library/en-//us/vcstdlib/html/vclrf_new_setnewhandler.asp

Return Value

0 on the first call and the previous new_handler on subsequent calls.

Remarks

The function stores _Pnew in a static new handler pointer that it maintains, then returns the value previously stored in the pointer. The new handler is used by operator new(size_t).

Example

// new_set_new_handler.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;
void __cdecl newhandler( )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //__cdecl程序的压栈方式为C风格
//__stdcall为PASCAL风格
//举个例子:
//(1) C函数 Fun1(a,b,c)
// 函数调用时,参数压栈顺序为 c , b , a
//(2) PASCAL函数 Fun(a,b,c)
// 函数调用时,参数压栈顺序为 a, b , c { cout << "The new_handler is called:" << endl; throw bad_alloc( ); return; } int main( ) { set_new_handler (newhandler); try { while ( 1 ) { new int[5000000]; cout << "Allocating 5000000 ints." << endl; } } catch ( exception e ) { cout << e.what( ) << " xxx" << endl; } }

Sample Output

Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
The new_handler is called:
bad allocation

以上例子程序在VC6.0环境下不能编译通过,但在dev_c++中可以通过编译,虽然没试过但相信在gcc下同样可以实现。如果在VC6.0环境下编译,那么必须用_set_new_handler而非set_new_handler, 下面是一个c风格的使用例子。

Example

/* HANDLER.CPP: This program uses _set_new_handler to 
 * print an error message if the new operator fails.
 */

#include <stdio.h>
#include <new.h>

/* Allocate memory in chunks of size MemBlock. */
const size_t MemBlock = 1024;

/* Allocate a memory block for the printf function to use in case
 * of memory allocation failure; the printf function uses malloc.
 * The failsafe memory block must be visible globally because the
 * handle_program_memory_depletion function can take one 
 * argument only.
 */
//非常值得注意的是在这个地方,当内存分配时如果你需要打印提示信息,而打印的步骤也是需要内存的,为防止
//连打印错误信息所需的内存都没有的窘态,必须事先先开辟一块内存以备不时之需,在内存不足需打印信息时可先放掉
//这块预留内存,这就是failsafe的用处所在。具体的请参考msdn中关于_set_new_handler的说明,以及Scott Mayers
在effective c++ 2e iterm7中相关的说明
char * failsafe = new char[128];

/* Declare a customized function to handle memory-allocation failure.
 * Pass this function as an argument to _set_new_handler.
 */
int handle_program_memory_depletion( size_t );

void main( void )
{
   // Register existence of a new memory handler.
   _set_new_handler( handle_program_memory_depletion );
   size_t *pmemdump = new size_t[MemBlock];
   for( ; pmemdump != 0; pmemdump = new size_t[MemBlock] );
}

int handle_program_memory_depletion( size_t size )
{
   // Release character buffer memory.
   delete failsafe;
   printf( "Allocation failed, " );
   printf( "%u bytes not available.\n", size );
   // Tell new to stop allocation attempts.
   return 0;
}

Output

Allocation failed %0 bytes not available.

分享到:
评论

相关推荐

    C++ 内存分配处理函数set_new_handler的使用

    《C++内存分配处理函数set_new_handler的使用详解》 C++编程语言提供了一种机制,当内存分配失败时能够自定义处理行为,这就是通过`set_new_handler`函数。这个函数允许程序员在new操作或new[]操作无法为对象分配...

    ortp wince

    ortp_set_log_handler ortp_strdup_printf ortp_logv ortp_get_global_stats ortp_global_stats_display session_set_new session_set_select session_set_destroy rtp_stats_display rtp_session_...

    php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACEeval&#40;&#41;d code error

    - 错误处理可以通过`set_error_handler()`自定义,可以实现自定义的错误处理函数。 - `set_exception_handler()`可以设定当一个错误被当作异常抛出时的处理方式。 6. **PHP框架中的异常处理**: - 在像Yii这样的...

    PHP使用Redis替代文件存储Session的方法

    bool session_set_save_handler( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc ); ``` - `open`: 当Session启动时调用,接收两个参数,分别是...

    C++异常处理

    此外,C++异常处理还涉及到动态内存分配时的new_handler机制,new_handler是一个函数指针,当new操作无法分配内存时,会调用由set_new_handler设置的new_handler函数。程序员可以利用这一机制来处理动态内存分配失败...

    xerces-c-src_2_8_0安装&开发文档.doc

    parser-&gt;setErrorHandler(new MyErrorHandler()); ``` ##### 11. 设置过滤器属性 还可以设置过滤器属性来控制解析过程中哪些元素被忽略或处理。这有助于优化解析性能。 ##### 12. 格式化输出 为了美化文档的格式...

    Android 下拉刷新

    new Handler().postDelayed(new Runnable() { public void run() { // infoList.clear(); swipeLayout.setRefreshing(false); ItemInfo info = new ItemInfo(); for (int i = 0; i ; i++) { ...

    coredll dll API大全

    ##### `_query_new_handler` 和 `_set_new_handler` - **`?_query_new_handler@@YAP6AHI@ZXZ`**: 查询当前的新内存处理器。 - **`?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z`**: 设置新的内存处理器。 #### 总结 以上...

    C++编程中new运算符的使用学习教程

    new运算符用作从自由存储为 type-name 的对象或对象数组分配... 通过编写自定义异常处理例程并调用 _set_new_handler 运行库函数(以您的函数名称作为其参数),可以更改此默认行为。 有关如何在托管堆上创建对象的信

    BluetoothDemoV1.2

    private Handler _handler = new Handler(); ArrayAdapter&lt;String&gt; adapter = null; /* 请求打开蓝牙 */ @SuppressWarnings("unused") private static final int REQUEST_ENABLE = 0x1; private static final ...

    最新PCSC CCID 测试源码

    最新的PCSC、CCID以及测试源码。 贴一段源码: ... * Propagate new state to reader state */ rContext-&gt;readerState-&gt;readerSharing = rContext-&gt;contexts; PROFILE_END return SCARD_S_SUCCESS; }

    eXtended osip library 用户手册

    osip_request_set_method(new_register_request, "REGISTER"); // 发送新的 REGISTER 请求 int ret = exosip_send(dialog, new_register_request); if (ret ) { fprintf(stderr, "发送新的 REGISTER 请求失败\n");...

    SESSION高级用法

    总结起来,自定义 Session 存储路径和使用 `session_set_save_handler()` 函数能够帮助开发者更加灵活地管理 Session 数据,同时也能根据具体的应用场景进行更高级的定制化设置。通过对 php.ini 文件中相关配置项的...

    PHP各种异常和错误的拦截方法及发生致命错误时进行报警

    1. `set_exception_handler` 函数用于设置用户自定义的异常处理函数。当一个未被捕获的异常抛出时,这个用户定义的函数会被调用。 2. `set_error_handler` 函数用于设置用户自定义的错误处理函数。与异常处理函数...

    BluetoothDemo

    private Handler _handler = new Handler(); ArrayAdapter&lt;String&gt; adapter = null; /* 请求打开蓝牙 */ @SuppressWarnings("unused") private static final int REQUEST_ENABLE = 0x1; private static final ...

    GTK全屏应用程序简单例子

    gtk_window_set_title(GTK_WINDOW(window), "GTK Fullscreen Example"); // 设置窗口关闭时退出程序 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); // 当用户按下F11键时,切换...

    php中将session保存到数据库的函数类代码.zip

    本文将详细探讨如何实现这一功能,特别是通过编写一个自定义的Session处理器类,并使用`session_set_save_handler()`函数进行注册。 首先,让我们理解`session_set_save_handler()`函数的作用。这个函数允许我们...

    php中将session保存到数据库的函数类代码

    $handler = new SessionHandler(); session_set_save_handler( array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array...

    mempool_hook_userdef_0924

    2. 使用`std::set_new_handler`或`std::set_delete_handler`(对于C++11及以上版本)设置钩子。在C++标准库中,没有直接提供设置malloc钩子的接口,但可以使用glibc等库提供的扩展接口(如`__malloc_hook`和`__free_...

Global site tag (gtag.js) - Google Analytics