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

new操作符的使用问题[ask in smth]

阅读更多
new操作符的使用问题
发信站:水木社区(ThuOct610:49:312005),站内


下面的程序是effectivec++中用来说明new操作符的一段代码,
但是我运行了一下,并没有得到预期的效果
代码如下:
voidnoMoreMemory()
{
cerr<<"Unabletosatisfyrequestformemory\n";
abort();
}

intmain()
{
set_new_handler(noMoreMemory);
int*pBigMemory=newint[100000000];
}

预期的效果是开辟不了那么大的内存,因此noMoreMemory会被调用,因而会输出出错信息随后程序终止。
但是我在VC6.0下执行时
抛出如下异常;
Assertionfailed:new_p==0,filesetnewh.cpp,line52

abnormalprogramtermination


btw:俺想用dev_cpp也同样试一下,可惜俺没用过,不知道dev_c++的比标准输出在那里
查看不到输出的信息。
--

※来源:·水木社区http://newsmth.net·[FROM:61.167.60.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Shaq0Neal] [进入讨论区] [返回顶部] 2
发信人:Shaq0Neal(无敌超人——大鲨鱼),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct611:26:142005),站内

VC的set_new_handler()的参数返回值与C++标准库不一样,建议用gcc
另外,现在的机器开辟100000000个int不会发生内存无法分配错误的,即使分配更大的内存
好像也不会发生,因为可以虚拟内存(我的笔记本曾经分配到2个G就不动了,但是内存分配错误还是没有发生)。建议你重载操作符new,模拟一下内存分配错误就可以了
【在jiangfei(afei)的大作中提到:】
:下面的程序是effectivec++中用来说明new操作符的一段代码,
:但是我运行了一下,并没有得到预期的效果
:代码如下:
:...................



--

※来源:·水木社区http://newsmth.net·[FROM:202.120.2.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:zsth] [进入讨论区] [返回顶部] 3
发信人:zsth(小皮),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct612:37:342005),站内

在VC下,你应该用_set_new_handler,可以得到预期得效果,具体可以参见MSDN

【在jiangfei(afei)的大作中提到:】
:下面的程序是effectivec++中用来说明new操作符的一段代码,
:但是我运行了一下,并没有得到预期的效果
:代码如下:
:...................

--
Becausewearecurious;
Becausewearelazy;
Becausewearenotsoable.


※来源:·水木社区newsmth.net·[FROM:59.66.116.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 4
发信人:jiangfei(afei),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct614:54:352005),站内

谢谢!

再问一下;正如下面这个msdn中使用_set_new_handler的例子,
在main函数里面,首先设置了new操作失败的处理方法,然以后才是new操作,
一旦new操作出现failure,接下来是如何运作呢?
我觉得应该是:
1.new失败,抛出std::bad_alloc();
2.系统接到这个异常,---这里的系统应该是c++内部机制?
3.系统调用设定好的对应new_handler去处理它,正如下面程序中的
handle_program_memory_depletion();

这是否涉及到run-time这种机制呢?
c++这种处理异常的机制对于我这种不了解的编程者来说就好像神秘的幕后工作者。
赫赫,明白的朋友可否给我讲一下,谢谢了

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

/*AllocatememoryinchunksofsizeMemBlock.*/
constsize_tMemBlock=1024;

/*Allocateamemoryblockfortheprintffunctiontouseincase
*ofmemoryallocationfailure;theprintffunctionusesmalloc.
*Thefailsafememoryblockmustbevisiblegloballybecausethe
*handle_program_memory_depletionfunctioncantakeone
*argumentonly.
*/
char*failsafe=newchar[128];

/*Declareacustomizedfunctiontohandlememory-allocationfailure.
*Passthisfunctionasanargumentto_set_new_handler.
*/
inthandle_program_memory_depletion(size_t);

voidmain(void)
{
//Registerexistenceofanewmemoryhandler.
_set_new_handler(handle_program_memory_depletion);
size_t*pmemdump=newsize_t[MemBlock];
for(;pmemdump!=0;pmemdump=newsize_t[MemBlock]);
}

inthandle_program_memory_depletion(size_tsize)
{
//Releasecharacterbuffermemory.
deletefailsafe;
printf("Allocationfailed,");
printf("%ubytesnotavailable.\n",size);
//Tellnewtostopallocationattempts.
return0;
}



【在zsth(小皮)的大作中提到:】
:在VC下,你应该用_set_new_handler,可以得到预期得效果,具体可以参见MSDN



--

※修改:·jiangfei於Oct614:56:00修改本文·[FROM:61.167.60.*]
※来源:·水木社区http://newsmth.net·[FROM:61.167.60.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:zsth] [进入讨论区] [返回顶部] 5
发信人:zsth(小皮),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct616:29:002005),站内

具体来说就是:
1.当new失败时抛出一个异常,即bad_alloc
2.程序在运行期检查你的代码,看是否有能力捕捉该异常,检查顺序由里而外,即从new本身开始,看其能否捕捉该异常,若你设置了new_handler则异常得到处理,否则检查new所在得函数、函数得调用者,如果都没有try-catch结构将其捕捉,则
3.调用特殊函数unexpected,其缺省行为是调用abort,程序中断

需要注意得是,当异常发生时,程序执行将跳到能捕捉它得代码段继续执行或者干脆直接
中断,这会跳过一些原本要执行的命令,如果这些命令中包含释放资源命令,那么就会导致
资源泄漏,因此必需在捕捉异常的代码段中补上。
【在jiangfei(afei)的大作中提到:】
:谢谢!
:再问一下;正如下面这个msdn中使用_set_new_handler的例子,
:在main函数里面,首先设置了new操作失败的处理方法,然以后才是new操作,
:...................

--
Becausewearecurious;
Becausewearelazy;
Becausewearenotsoable.


※来源:·水木社区newsmth.net·[FROM:59.66.116.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 6
发信人:jiangfei(afei),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct616:35:562005),站内


【在zsth(小皮)的大作中提到:】
:具体来说就是:
:1.当new失败时抛出一个异常,即bad_alloc
:2.程序在运行谢谢
你是说,如果没有释放资源的话,在处理异常的catch里面应该释放掉?

期检查你的代码,看是否有能力捕捉该异常,检查顺序由里而外,即从new本身开始,看
其能否捕捉该异常,若你设置了new_handler则异常得到处理,否则检查new所在得函数、
函数得调用者,如果都没有try-catch结构将其捕捉,则
:...................

--

※来源:·水木社区newsmth.net·[FROM:61.167.60.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:zsth] [进入讨论区] [返回顶部] 7
发信人:zsth(小皮),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct616:39:582005),站内

是的,如果他不能自动释放的话

【在jiangfei(afei)的大作中提到:】
:你是说,如果没有释放资源的话,在处理异常的catch里面应该释放掉?
:期检查你的代码,看是否有能力捕捉该异常,检查顺序由里而外,即从new本身开始,看
:其能否捕捉该异常,若你设置了new_handler则异常得到处理,否则检查new所在得函数、
:...................

--
Becausewearecurious;
Becausewearelazy;
Becausewearenotsoable.


※来源:·水木社区newsmth.net·[FROM:59.66.116.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:ilovecpp] [进入讨论区] [返回顶部] 8
发信人:ilovecpp(cpp),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct616:50:512005),站内

【在zsth(小皮)的大作中提到:】
:具体来说就是:
:1.当new失败时抛出一个异常,即bad_alloc
:2.程序在运行期检查你的代码,看是否有能力捕捉该异常,检查顺序由里而外,即从new本身开始,看其能否捕捉该异常,若你设置了new_handler则异常得到处理,否则检查new所在得函数、函数得调用者,如果都没有try-catch结构将其捕捉,则
:3.调用特殊函数unexpected,其缺省行为是调用abort,程序中断

你说得不对。见std18.4.1或tc++pl14.4.5。

--

※来源:·水木社区newsmth.net·[FROM:162.105.88.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Shaq0Neal] [进入讨论区] [返回顶部] 9
发信人:Shaq0Neal(无敌超人——大鲨鱼),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct617:40:472005),站内

不同意你的说法,
new的操作步骤,在C++标准中说的清清楚楚,如果分配内存失败,new首先调用在
set_new_handler中设置的错误处理函数——new_handler,你可以在该函数中设置多种错误处理方法,一般来说有五种方法可以选择,其中之一就是设置新的错误处理函数。
因此,在new中,可能调用多个错误处理函数,只有在这些处理函数均失败的情况下,才会抛出一个bad_alloc异常。
VC虽然与stdC++稍有不同,但是new的操作流程应该是一样的,绝对不会一失败就抛出异常,再由new_handler去捕捉异常,恰后次序搞错了。


【在zsth(小皮)的大作中提到:】
:具体来说就是:
:1.当new失败时抛出一个异常,即bad_alloc
:2.程序在运行期检查你的代码,看是否有能力捕捉该异常,检查顺序由里而外,即从new本身开始,看其能否捕捉该异常,若你设置了new_handler则异常得到处理,否则检查new所在得函数、函数得调用者,如果都没有try-catch结构将其捕捉,则
:...................



--

※来源:·水木社区http://newsmth.net·[FROM:220.188.79.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:zsth] [进入讨论区] [返回顶部] 10
发信人:zsth(小皮),信区:CPlusPlus
标题:Re:new操作符的使用问题
发信站:水木社区(ThuOct619:55:142005),站内

多谢各位指正,我刚查了tc++pl,new的行为应与下面类似:
void*operatornew(size_tsize)
{
for(;;)
{
if(void*p=malloc(size))returnp;
if(_new_handler==0)throwbad_alloc();
_new_handler();
}
}

当new失败时,它首先尝试_new_handler,为空才抛出异常

【在ilovecpp(cpp)的大作中提到:】
:你说得不对。见std18.4.1或tc++pl14.4.5。


--
Becausewearecurious;
Becausewearelazy;
Becausewearenotsoable.


※来源:·水木社区newsmth.net·[FROM:59.66.116.*]
分享到:
评论

相关推荐

    SMTH-Java.chm

    SMTH-Java

    VC代码 fterm-smth (实用代码源)

    VC代码 fterm-smth (实用代码源)VC代码 fterm-smth (实用代码源)VC代码 fterm-smth (实用代码源)VC代码 fterm-smth (实用代码源)VC代码 fterm-smth (实用代码源)VC代码 fterm-smth (实用代码源)VC代码 fterm-smth ...

    smth上的OpengL教程

    smth上的OpengL教程,很详细很方便 希望对大家有帮助

    smth

    开发移动应用时,离线存储可以确保用户在无网络环境下也能正常使用部分功能。 综上所述,HTML5的新特性极大地拓宽了网页开发的可能性,提升了用户体验。开发者应熟练掌握并灵活运用这些特性,以创建更加先进、功能...

    smth images helper-crx插件

    "smth images helper-crx插件"是一款专为浏览newsmth.net网站设计的扩展程序,主要用于增强用户体验,特别是对于那些在该网站上遇到图片显示问题的用户。这款插件的核心功能是帮助用户查看newsmth.net上的图片,因为...

    smth.alfredworkflow:用于浏览 newsmth.net 的 alfred 工作流程

    水木社区 workflow 安装 [下载][down] [down]: 使用 浏览今日十大: smth 查找板块: smth 板块拼音 smth shuimu smth jingji 浏览板块: smth &gt; 板块ID smth &gt; ITExpress smth &gt; EconForum 版本 v0.1

    Live Capture

    修正罕见操作后出现跟随鼠标提示不消失问题,谢pomuyu@smth 修正截图文件名不能任意组合内置变量问题,谢pomuyu@smth 修改中文“多模合一截图”叫法为“截图并加标注”,谢pomuyu@smth # 发行版本: 1.0.5 ...

    Live Capture1.2.4

    修正罕见操作后出现跟随鼠标提示不消失问题,谢pomuyu@smth 修正截图文件名不能任意组合内置变量问题,谢pomuyu@smth 修改中文“多模合一截图”叫法为“截图并加标注”,谢pomuyu@smth # 发行版本: 1.0.5 ...

    python xlwt如何设置单元格的自定义背景颜色

    问题 我使用python 2.7和xlwt模块进行excel导出 我想设置我知道可以使用的单元格的背景颜色 style1 = xlwt.easyxf('pattern: pattern solid, fore_colour red;') 但我想设置自定义颜色smth。比如#8a8eef或者是否有...

    smth-like-search-engine

    文件搜寻引擎 如何开始 ./mvnw -DskipTests=true clean spring-boot:run 测试方法 我决定在测试中使用简单的http客户端,而不是客户端 ...我知道您想了解我如何使用git,但是在这里我们进行1次提交

    svg2gd:圈到gd或smth

    获取节点( )使用Geometrize创建一个SVG文件( ) 将文件放在文件夹中,在settings.txt中更改名称 主页/桌面/编码资料/svg2gd/test.svg主页/文件夹/文件夹/svg2gd/FILENAME.svg 使用runProgram.bat转换为gd img ...

    kernel-modules-hook:内核升级后保持Arch Linux的全部功能

    modprobe: FATAL: Module smth not found in directory /lib/modules/new-kernel惹恼了modprobe: FATAL: Module smth not found in directory /lib/modules/new-kernel吗? 由于内核更新,重启后会丢失正常运行时间...

    JAVA编程规范

    7.6 **换行符使用**:统一使用平台默认的换行符,避免跨平台编译和运行时的格式问题。 综上所述,JAVA编程规范不仅是代码风格的指导原则,更是团队协作和项目管理的重要组成部分。遵循这些规范,不仅能够提高个人...

    um-smth

    在Heroku上托管基于repl的discord.py bot,以使其保持INDEFINETLY的运行 ... 在“部署”下,执行以下操作: 部署方法=&gt;连接您的GitHub 应用已连接到GitHub =&gt;搜索分叉的存储库 自动部署=&gt;启用自动部署(在每

    java程序的代码规范

    - 在操作符两侧使用空格。 **3.4 声明** - **3.4.1 每行一个** - 每行只声明一个变量。 - **3.4.2 初始化** - 尽可能在声明变量时对其进行初始化。 - **3.4.3 位置** - 变量应在使用之前声明。 #### 4. 程序...

    smthbbs-1.1.1.rar

    在标签中同样使用了 "smth",这进一步确认了它可能是该软件或系统的核心标识。 由于文件列表只给出了 "smthbbs-1.1.1",我们可以假设这个压缩包包含了一个完整的项目或软件的源代码、二进制文件、文档或其他相关...

    用于平滑GPS INS 的Matlab脚本

    在 gps_smth_ins 函数中,您可以使用 EKF 或 MAP 平滑器作为估计器。 对于这两个估计器,您可以选择使用双频测量或仅 L1。 对于 EKF,可以使用双差分码测量和/或整数求解相位测量。 对于平滑,首先应用 EKF(仅...

    帮助图片帮手「smth images helper」-crx插件

    显示newsmth.net的图像 帮助显示 http://newsmth.net/ 部分图片 支持语言:中文 (简体)

    地震学FK中文使用手册

    #### 三、操作流程与使用说明 实际应用时,用户需按照以下步骤操作: - **第一步**: 使用`fk.pl`生成格林函数; - **第二步**: 使用`syn`程序将格林函数合成为三分量地震图。 #### 四、速度模型与输入格式 **输入...

Global site tag (gtag.js) - Google Analytics