New Handler
1.new handler
(1)当operator new 没能力为你分配出你所申请的memory,会抛一个std::bad_alloc exception。某些老编译器则是返回0---你仍然可以令编译器那么做:
new (nothrow) Foo;
此为nothrow形式。
(2)抛出exception之前会先(不止一次)调用一个可由client指定的handler,以下是new handler的形式和设定方法:
typedef void (*new_handler)();
new_handlerset_new_handler(new_handler p) throw();
(3)设计良好的new handler只有两种选择:
[1]更多memory可用
[2]调用abort()或exit()、
(4)
void* operator new(size_t size, const std::nothrow_t&)
_THROW0()
{
//try to allocate size bytes
void* p;
while((p = malloc(size)) == 0) {
//buy more memory or return null pointer
_TRY_BEGIN
if( _callnewh(size) == 0) break;
_CATCH(std::bad_alloc) return (0);
_CATCH_END
}
return (p);
}
(5)示例
#include <iostream>
#include <new>
#include <cassert>using namespace std;void noMoreMemory() {cout << "Out of memory";abort();
}int main() {set_new_handler(noMoreMemory);int* p = new int[100000000000000000];assert(p);p = new int[10000000000000];assert(p);return 0;
}
本例中的new handler中若无调用abort(),执行后cerr会不断出现"out of memory",需强制中断。这样的表现是正确的,表示当operator new无法满足申请量时,会不断调用new handler直到获得足够memory
(6)new_handler __cdecl set_new_handler(
new_handlernew_p)
{
//cannot use stub to register a new handler
assert(new_p == 0);
//remove current handler
_set_new_handler(0);
return 0;
}
2.=default,=delete
class Foo {
public:
Foo() = default;
Foo(const Foo&) = default;
Foo& operator=(const Foo&) = delete;
~Foo() = default;
};
it is not only for constructors and assignments,but also applies to operator new/new[],operator delete/delete[] and their overloads.
#include <iostream>
using namespace std;class Foo {
public:long L;
public:Foo() {}Foo(long l): L(l) {}//static void* operator new(size_t size) = default;//error: 'static void* Foo::operator new(size_t)' cannot be defaulted//static void operator delete(void* pdead, size_t size) = default;//error: 'static void Foo::operator delete(void*, size_t)' cannot be defaultedstatic void* operator new[](size_t size);static void operator delete[](void* pdead, size_t size);
};class Goo {
public:long L;
public:Goo() {}Goo(long l): L(l) {}static void* operator new(size_t size) = delete ;static void operator delete(void* pdead, size_t size) = delete ;
};int main() {Foo* p1 = new Foo(5);delete p1;//Foo* pF = new Foo[10];//delete[] pF;//Goo* p2 = new Goo(7);//delete p2;Goo* pG = new Goo[10];delete[] pG;return 0;
}
New Handler相关推荐
- 为什么UI线程中创建Handler可以不传Looper?
一个APP程序的入口是ActivityThread的main方法,ActivityThread就是我们常说的主线程或UI线程,事实上它并不是一个线程,而是主线程操作的管理者. public stati ...
- Android中Handler消息机制
作用:跨线程通信. 应用:AsyncTask.retrofit都对Handler进行了封装. 四要素:Message.MessageQueue.Looper.Handler Message简介: 线程 ...
- Python:urllib2模块Handler处理器 和 自定义Opener
Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...
- Android Handler sendMessage和 sendMessageDelayed的使用
sendMessage :立即发送消息 sendMessageDelayed:指定多少毫秒后发送消息. 其实常用的还有2个 sendEmptyMessage 发送空消息, 一般自己想把某种操作放到子 ...
- Handler 实现的一个循环操作
这个使用Handler 实现的一个循环操作还是比较简单的,下面就直接给出demo了 一个间隔5s 弹一次Toast 的demo 如下 public class MainActivity extends ...
- Handler 实现的一个延时操作
今天回顾下handler 记录一个延时的demo 使用 postDelayed 主要代码如下: public class MainActivity extends AppCompatActivity ...
- Android 实现一个验证码倒计时(Handler postDelayed 实现验证码倒计时)
直接看代码吧,很简单 public class MainActivity extends AppCompatActivity {private TextView code;private Handle ...
- Android Handler sendEmptyMessageDelayed 和 sendEmptyMessage 的使用
sendEmptyMessage 发送空消息 sendEmptyMessageDelayed 指定多少毫秒后发送空消息 常用的还有2个如下 sendMessage :立即发送消息 sendMessag ...
- Handler的postDelayed()关闭的方法
关闭的方法主要使用removeCallbacks,下面举一个demo 说明 使用方法: 1,首先创建一个Handler对象 Handler handler=new Handler(); 2,然后创建一 ...
- Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)...
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_simpleurlhandlermapping.htm 说明:示例基于Spring ...
最新文章
- Oracle Dataguard中备库中归档日志不同步
- Ch2r_ood_understanding 本文档为论文限定领域口语对话系统中超出领域话语的对话行为识别的部分实验代码。代码基于Python,需要用到的外部库有: Keras(搭建神经网络) S
- ssh、私钥、密钥理解
- python re模块 字符串匹配_re模块实现正则表达式之match()方法
- 程序员简历的 8 个建议
- html页面中Location对象跳转页面用法
- java jdbc 连接mysql数据库,Java 通过JDBC连接Mysql数据库
- CentOS中的网络管理
- HIPO图、IPO图、H图的关系
- 使用cmd命令查看占用进程并结束进程
- 如何用计算机控制三相电机,计算机控制 课程设计 三相步进电机控制.docx
- 使用ADSL拨号服务器搭建自己的代理IP
- 网站维护需要做些什么?
- ui设计要素;ui设计要素有哪些
- poj求排列的逆序数
- phpstudy后门
- python 数学期望_python机器学习笔记:EM算法
- syncthing下载_syncthing下载-Syncthing-Fork(文件同步)下载v1.1.3.1 安卓版-西西软件下载...
- [PWN]/瑞士军刀
- Latex 中目录生成超链接