怎么在C++中使用set_new_handler函数-创新互联

怎么在C++中使用set_new_handler函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在新建等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都网站制作、外贸网站建设 网站设计制作按需制作网站,公司网站建设,企业网站建设,高端网站设计,营销型网站建设,成都外贸网站制作,新建网站建设费用合理。

一、函数的定义

函数在namespace std中有如下定义(C++98与C++11版本不一致):

Typedef void (*new_handler)();
 
new_handler set_new_handler(new_handler new_p) throw();  //C++98
new_handler set_new_handler (new_handler new_p) noexcept; //C++11

二、函数介绍

该函数的作用是:当new操作或new[]操作失败时调用参数所指的new_p函数

异常安全:

  • C++98、C++11分别在函数后面使用了throw()、noexcept声明,所以该函数(set_new_handler)不会抛出异常

  • 注意:如果new_p是没有实现适当功能的函数指针(见下面的参数说明),或者如果new_p是无效的指针,它会导致未定义的行为

数据争用:

  • 调用此函数不会引入数据竞争,任何这样的调用将会和随后set_new_handler和set_new_handler的调用同步

  • 注意,此要求仅适用于set_new_handler函数,但对于作为参数(new_p)传递的新处理函数却非必须

函数说明

1.   set_new_handler函数的作用是设置new_p指向的函数为new操作或new[]操作失败时调用的处理函数。

2.   设置的处理函数可以尝试使更多空间变为可分配状态,这样新一次的new操作就可能成功。当且仅当该函数成功获得更多可用空间它才会返回;否则它将抛出bad_alloc异常(或者继承该异常的子类)或者终止程序(例如调用abort或exit)。

3.   如果设置的处理函数返回了(例如,该函数成功获得了更多的可用空间),它可能将被反复调用,直到内存分配成功,或者它不再返回,或者被其它函数所替代。

4.   在尚未用set_new_handler设置处理函数,或者设置的处理函数为空时,将调用默认的处理函数,该函数在内存分配失败时抛出bad_alloc异常。

三、函数的参数
new_p:

  • 当new操作或new[]操作失败时调用的函数

  • 该函数参数列表为空,且返回值类型为void

  • 该函数可以尝试获得更多的可用空间,或者抛出异常,或者终止程序

  • 如果是一个空指针或0,处理函数将被重置为默认值(将会执行抛出bad_alloc异常)

设置的处理函数可以尝试使更多空间变为可分配状态,这样新一次的new操作就可能成功。当且仅当该函数成功获得更多可用空间它才会返回;否则它将抛出bad_alloc异常(或者继承该异常的子类)或者终止程序(例如调用abort或exit)

如果设置的处理函数返回了(例如,该函数成功获得了更多的可用空间),它可能将被反复调用,直到内存分配成功,或者它不再返回,或者被其它函数所替代

如果未设置处理函数,或者设置的处理函数为空时,将调用默认的处理函数,该函数在内存分配失败时抛出bad_alloc异常

四、函数的返回值

  • 返回先前被设置的处理函数指针

  • 如果set_new_handler参数为空或者已被重置,将返回空指针

  • 返回的函数指针是无参数的且返回值为void类型的

五、演示案例

下面程序中new操作分配内存失败时将调用no_memory函数

// new_handler example
#include    // std::cout
#include    // std::exit
#include      // std::set_new_handler
 
void no_memory () {
 std::cout << "Failed to allocate memory!\n";
 std::exit (1);
}
 
int main () {
  //绑定no_memory处理函数
  std::set_new_handler(no_memory);
  
  std::cout << "Attempting to allocate 1 GiB...";
  char* p = new char [1024*1024*1024];
  std::cout << "Ok\n";
  
  delete[] p;
  return 0;
}

关于怎么在C++中使用set_new_handler函数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联网站建设公司行业资讯频道了解更多相关知识。

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页标题:怎么在C++中使用set_new_handler函数-创新互联
标题路径:http://azwzsj.com/article/dhdsos.html