当前位置: 首页 > news >正文

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.*]

相关文章:

  • python王者战斗_用 Python 自动玩王者荣耀,简直不要太秀!
  • 大家在申请内存时都是如何做的?[ask in smth]
  • 单例模式获取mysql连接_获取JDBC Connection单例模式
  • centos7安装源mysql5.6_centos7.4 mysql5.6 源码安装
  • 系统安装时文件系统的选择
  • python super 多重继承_Python的super()如何处理多重继承?
  • debian系统安装
  • qt修改程序图标名称_Qt for Android修改应用程序的图标和名称
  • 一些有用的打电话,写email,写信一些有用的知识
  • vscode自动快捷格式化代码_vsCode 代码格式化(Ctrl+S自动格式化代码+保存)
  • java数组定义错误_JAVA定义数组 int a[]=new int[100000] 错误
  • java 执行查询_java执行SQL语句实现查询的通用方法详解
  • linux使用学习手记[不断更新]
  • htmlparser的使用java_HTMLParser的使用
  • 访《桃花源记》之桃花源
  • 《Java编程思想》读书笔记-对象导论
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • node和express搭建代理服务器(源码)
  • PhantomJS 安装
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SpringBoot几种定时任务的实现方式
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 工作手记之html2canvas使用概述
  • 算法-图和图算法
  • 微信小程序设置上一页数据
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ###STL(标准模板库)
  • #pragam once 和 #ifndef 预编译头
  • $.each()与$(selector).each()
  • (12)Hive调优——count distinct去重优化
  • (31)对象的克隆
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一) storm的集群安装与配置
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .net core 控制台应用程序读取配置文件app.config
  • .Net IOC框架入门之一 Unity
  • // an array of int
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @Not - Empty-Null-Blank
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @synthesize和@dynamic分别有什么作用?
  • [20160902]rm -rf的惨案.txt
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C++核心编程](四):类和对象——封装
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [Editor]Unity Editor类常用方法
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [HarmonyOS]第一课:从简单的页面开始