我在EXE里面set_new_handler(MyNewHandler),然后在DLL里面分配内存(CMap SetAt...)
它调用MFC的内部CPlex分配内存.因为内存不够失败,然后进入我的MyNewHandler函数.
MyNewHandler返回0,按照MSDN上的说法因该抛出异常.然而我在DLL里面捕捉CMemoryException没有效果.CException也不行.我跟踪一看,原来没有抛出任何异常.然后MFC使用空指针出错.
我想知道为什么MFC没有抛出异常,有人知道伐
谢谢
它调用MFC的内部CPlex分配内存.因为内存不够失败,然后进入我的MyNewHandler函数.
MyNewHandler返回0,按照MSDN上的说法因该抛出异常.然而我在DLL里面捕捉CMemoryException没有效果.CException也不行.我跟踪一看,原来没有抛出任何异常.然后MFC使用空指针出错.
我想知道为什么MFC没有抛出异常,有人知道伐
谢谢
解决方案 »
- 求助,有关ReadString()和WriteString()
- 求JPEG2000压缩代码
- VC EZ-USB异步传输速率低问题 急~~~
- CView,CListView,CTreeView的問題,怎麼動態改變,100分,不夠再加
- VC在 word中应用,高手请进!
- 对深入浅出MFC的看法!
- 请问2002年在深圳报考高级程序员在什么地方报名? 报名时间 ? 有什么要求?
- 请问如何使用_RecordsetPtr m_spRS,的m_spRS->EOF ?
- 求,塞班系统的虚拟键盘源代码
- 请问各位高手一个简单的C++语法问题
- VC中插入汇编
- 曾看到过一段被称为“外星人的代码”的小程序,C写的,不超过十行,有人知道吗?
CPlex* PASCAL CPlex::Create(CPlex*& pHead, UINT nMax, UINT cbElement)
{
ASSERT(nMax > 0 && cbElement > 0);
CPlex* p = (CPlex*) new BYTE[sizeof(CPlex) + nMax * cbElement];
// may throw exception
p->pNext = pHead; 这里使用空指针
pHead = p; // change head (adds in reverse order for simplicity)
return p;
}
void __cdecl newhandler( )
{
throw bad_alloc( );
return;
}
set_new_handler (newhandler);/*内存分配操作*/
VC6是不符合标准的,在new不到足够内存的时候并不抛出异常,而是返回指针为0,由此导致了有些假设分配错误时抛出异常的STL在VC6中使用会出现某些问题。不知道你的问题是不是由于这个。
但我自己写的类却可以进入CMEMORYEXCEPTION ,我没有重载OPERATOR NEW
{
DWORD dwNum = GetLastError();}
但我更想知道是不是因为MFC在内存分配上和标准的不一致,导致目前的情况.有没有办法可以解决.
AFXSETNEWHANDLER我也试过了.好像也没有效果
是系统的结构化异常,你要用SHE,还有编译选项, 看看Window调试 这本书。
如果你没有的话 系统就会老实的抛出异常.也就是说 你必须自己写这种分配内存不成功的handler程序.
晚上回去我给你看看。
程序起因是这样的,公司程序需要控制内存使用量,定为当前可用物理内存+可用页文件的80%。因为无法作到实时控制,所以我在程序开始的地方将进程地址空间都保留了,然后释放那80%的空间。按照我的想法,程序不会使用超量了。然后我设定了NEWHANDLER,在这个函数我判断是否需要返回继续分配还是抛出异常。然而大多数情况,程序内存使用量会超过我的设定值,一般会超过20M左右,然后进入NEWHANDLER,更有时候会内存用完,然后死机。
所以我现在怀疑是不是当进程地址空间不够的情况下,进程动用了系统为他保留的另外2G空间做处理的。或者说异常需要使用额外内存来完成处理,如果是这样的话,CMEMORYEXCEPTION就无法处理了,本身就内存不够了。
那么这个MyNewHandler就是当分配内存不成功后的处理函数,我觉得你有两种方法:
1.在MyNewHandler中释放一些内存,好让你下次new的时候有更多内存可用 那么下次new就可能成功,不过这样你需要对以前分配的内存处理好,就是说,你必须采用某种数据结构来表示你前面所分配的内存,那么后面才能按照你所愿释放.
2. set_new_handler(0) 这样就系统就认为你取消了内存分配不成功后的处理函数,则系统会自动抛出 bad_alloc异常》
bad_alloc在VC里面是没有的
也确像楼上言:
New 有些版本是会返回 0的 如果分配不成功,有些不成功的话 就抛出异常.楼主 那你set_new_handler中的函数的处理 可能还不够好
你试试 use namespace std;
然后抛出std::bad_alloc
现在碰到另外一个一直很困惑的问题,就是象我上面说的,进程地址空间用完的情况,程序进入我MyNewHandler花费了比较长的时间,而且内存会超过限度。
难道是在那个循环里面 不停的分配 继续分配??你可以跟踪一下 看看.我先上班了.