August 18th Tuesday
来源:互联网 发布:组策略下发软件 编辑:程序博客网 时间:2024/05/16 07:52
The new and delete operators are so important as to understand how to allocate or free memory from OS.
Now, I copy some logics on them and some information as follow.
void * operator new(size_t size) // operator new还可能有其它参数
{
if (size == 0) { // 处理0字节请求时,
size = 1; // 把它当作1个字节请求来处理
}
while (1) {
分配size字节内存;
if (分配成功)
return (指向内存的指针);
// 分配不成功,找出当前出错处理函数
new_handler globalhandler = set_new_handler(0);
set_new_handler(globalhandler);
if (globalhandler) (*globalhandler)();
else throw std::bad_alloc();
}
}
operator new不能满足内存分配请求时,new-handler函数不只调用一次,而是不断重复,直至找到足够的内存。实现重复调用的代码在条款8里可以看到,这里我用描述性的的语言来说明:一个设计得好的new-handler函数必须实现下面功能中的一种。
·产生更多的可用内存。这将使operator new下一次分配内存的尝试有可能获得成功。实施这一策略的一个方法是:在程序启动时分配一个大的内存块,然后在第一次调用new-handler时释放。释放时伴随着一些对用户的警告信息,如内存数量太少,下次请求可能会失败,除非又有更多的可用空间。
·安装另一个不同的new-handler函数。如果当前的new-handler函数不能产生更多的可用内存,可能它会知道另一个new-handler函数可以提供更多的资源。这样的话,当前的new-handler可以安装另一个new-handler来取代它(通过调用set_new_handler)。下一次operator new调用new-handler时,会使用最近安装的那个。(这一策略的另一个变通办法是让new-handler可以改变它自己的运行行为,那么下次调用时,它将做不同的事。方法是使new-handler可以修改那些影响它自身行为的静态或全局数据。)
·卸除new-handler。也就是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。
·抛出std::bad_alloc或从std::bad_alloc继承的其他类型的异常。这样的异常不会被operator new捕捉,所以它们会被送到最初进行内存请求的地方。(抛出别的不同类型的异常会违反operator new异常规范。规范中的缺省行为是调用abort,所以new-handler要抛出一个异常时,一定要确信它是从std::bad_alloc继承来的。想更多地了解异常规范,参见条款m14。)
·没有返回。典型做法是调用abort或exit。abort/exit可以在标准c库中找到
void operator delete(void *rawmemory)
{
if (rawmemory == 0) return; file://如/果指针为空,返回
//
释放rawmemory指向的内存;
return;
}
- August 18th Tuesday
- August 4th Tuesday
- August 20th Tuesday
- August 25th Tuesday
- August 7th Tuesday (八月 七日 火曜日)
- August 14th Tuesday (八月 十四日 火曜日)
- August 21th Tuesday (八月 二十一日 火曜日)
- August 28th Tuesday (八月 二十八日 火曜日)
- 2008 August 5th Tuesday (八月 五日 火曜日)
- 2008 August 12th Tuesday (八月 十二日 火曜日)
- 2008 August 19th Tuesday (八月 十九日 火曜日)
- 2008 August 26th Tuesday (八月 二十六日 火曜日)
- September 3th Tuesday
- September 29th Tuesday
- October 13th Tuesday
- October 15th Tuesday
- October 22th Tuesday
- October 27th Tuesday
- psservice.exe
- 解决Struts1.x中使用Validator框架对DispatchAction不同方法使用不同的字段验证
- 在VC6.0下创建自己的C函数库
- function should return a value; 'void' return type assumed
- Add/Remove ISAPI Filter to/from IIS Automatically Using Delphi
- August 18th Tuesday
- 四种新方法 - 硬盘安装Windows 7 RTM
- Flex中窗体参数传递方法
- 国外,国内的Java网站 - 转自http://www.linuxsir.org/bbs/showthread.php?t=197291
- Clutter学习(十三):可多行可编辑的ClutterText
- 郁闷的出纳员(用 Size Balanced tree);
- javascript的call 和apply的用法
- Linux系统域名服务(DNS)配置方法----RHEL4
- 应用程序初始化(0xc0000135)失败