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.*]
发信站:水木社区(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(无敌超人——大鲨鱼),信区: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(小皮),信区: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(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(小皮),信区: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(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(小皮),信区:CPlusPlus 标题:Re:new操作符的使用问题 发信站:水木社区(ThuOct616:39:582005),站内 是的,如果他不能自动释放的话 【在jiangfei(afei)的大作中提到:】 :你是说,如果没有释放资源的话,在处理异常的catch里面应该释放掉? :期检查你的代码,看是否有能力捕捉该异常,检查顺序由里而外,即从new本身开始,看 :其能否捕捉该异常,若你设置了new_handler则异常得到处理,否则检查new所在得函数、 :................... -- Becausewearecurious; Becausewearelazy; Becausewearenotsoable. ※来源:·水木社区newsmth.net·[FROM:59.66.116.*] |
| ||
发信人: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(无敌超人——大鲨鱼),信区: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(小皮),信区: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.*] |