为甚 set_new_handler 用不起来?(100分)

meijing 2003-08-21 07:15:31
想定制自己的new_handler,可是set_new_handler却用不起来:
编译没问题,但运行就出如下错误:
Assertion failed: new_p == 0, file setnewh.cpp, line 52

代码如下:
#include <stdio.h>
#include <iostream.h>
#include <new.h>

void my_new_handler(){
cout<<"ah-oh"<<endl;
}

new_handler oldone = set_new_handler(my_new_handler);

void main(){

}
...全文
107 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
meijing 2003-08-23
  • 打赏
  • 举报
回复
grail 批评的甚是。我也知道msdn很全,但总是会忘了用它,自己
瞎琢磨、乱翻书。
不过我想
vc6。0的set_new_handle只是把new的处理函数置零,要用_set_new-handle
挺怪的,为甚要和标准有点区别?为了显出自己的实力?
grail0922 2003-08-23
  • 打赏
  • 举报
回复
yellowdawnhlm(c###) 的是对的。
grail0922 2003-08-23
  • 打赏
  • 举报
回复
我首先要说得话就是:大家在这里说话,一定要尽可能的负责任,不然只会误人误几!!

第二句要说得话是:大家多去看看MSDN,不要人云亦云。

1。vc60绝对是能使用_set_new_handler()抛出异常的;microsoft没有你想象的那么傻。

2。new.h不再STL的名字空间中,所以即使用了using namespace std;也不能去掉.h;

3.看看_set_new_handler的原型:
_PNH _set_new_handler( _PNH pNewHandler );
_PNH, defined in NEW.H, is a pointer to a function that returns type int and takes an argument of type size_t. Use size_t to specify the amount of space to be allocated.
所以对象应该是_PNH也就是int的,所以上面用void 是错误的。

程序如下:
//#include <stdio.h>
#include <iostream>
#include <new.h>
using namespace std;


int my_new_handler(size_t size)
{
cout<<"ah-oh"<<endl;
return 0;
}

//new_handler oldone = set_new_handler(my_new_handler);

void main()
{

_set_new_handler(my_new_handler);
int *pi = new int[9999999999999999];
}
yellowdawnhlm 2003-08-23
  • 打赏
  • 举报
回复
vc6。0的set_new_handle只是把new的处理函数置零,要用_set_new-handle
ppm07 2003-08-23
  • 打赏
  • 举报
回复
任何一个编译器都有与标准不符的地方,没办法的,要实践所有的标准只有用多个编译器去实验。:)
ppm07 2003-08-23
  • 打赏
  • 举报
回复
原来如此,领教了。
meijing 2003-08-22
  • 打赏
  • 举报
回复
这么说是vc6.0又一个与c++标准不符的地方了?
装上sp5是不是是就可以了?(sp5哪里可以下?我到微软的网站上没找到)

还有,我想装vs.net,但是太大了,我只想把它当作vc7.0来用,可不可以
只装其中的vc部分?

谢谢。

明天结贴
ppm07 2003-08-21
  • 打赏
  • 举报
回复
不好意思,一个主是写错了。应该是这样的:
00409090 push ebp
00409091 mov ebp,esp
00409093 cmp dword ptr [new_p],0 //把传入参数和0比较
00409097 je set_new_handler+1Dh (004090ad)
。。。
ppm07 2003-08-21
  • 打赏
  • 举报
回复
不好意思,一个注释写错了。应该是
00409093 cmp dword ptr [new_p],0 //这里把new_p和0比较
00409097 je set_new_handler+1Dh (004090ad)
比较是在上一句。
ppm07 2003-08-21
  • 打赏
  • 举报
回复
我测试了一下发现:
1。当把头文件改成
#include <iostream>
#include <new>
using namespace std;
时,在vs.net环境下上述程序没有一点问题,完全正常。当是vc6.0环境下还是不行(没有装sp5)。
2。在vc6.0环境下跟踪进入,发觉set_new_handler(new_handler)是这样的:
set_new_handler:
00409090 push ebp
00409091 mov ebp,esp
00409093 cmp dword ptr [new_p],0
00409097 je set_new_handler+1Dh (004090ad) //比较
00409099 push 34h
0040909B push offset string "setnewh.cpp" (004303a4)
004090A0 push offset string "new_p == 0" (00430398)
004090A5 call _assert (0040df10) //断言失败,退出
004090AA add esp,0Ch
004090AD push 0 //若输入参数是空指针,到这
004090AF call _set_new_handler (0040deb0)
004090B4 add esp,4
004090B7 xor eax,eax
004090B9 pop ebp
004090BA ret
从上面可以很明显地看出,vc6.0不支持set_new_handler(new_handler).
aflyinghorse 2003-08-21
  • 打赏
  • 举报
回复
我在dev-cpp下试没问题
#include <stdio.h>
#include <iostream>
#include <new>
using namespace std;
void my_new_handler(){
cout<<"ah-oh"<<endl;
}

new_handler oldone = set_new_handler(my_new_handler);

int main(){
for(;;)
new string[999999];
getchar();
}
结果是不停的显示"ah-oh"
ppm07 2003-08-21
  • 打赏
  • 举报
回复
很奇怪呀,如果把
new_handler oldone = set_new_handler(my_new_handler);
改成
new_handler oldone = set_new_handler( 0 );
就没问题了。
难道有个断言是保证传入set_new_handler()这个函数的参数一定要是空指针吗?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧