CSocket ::在MFC应用程序中创建抛出异常
我有我的应用程序(VC MFC)使用启用PageHAP的gflags运行以追踪页堆损坏。
现在应用程序崩溃了,它显示了这个错误,我无法解释这些行(除了感觉到资源不可用)
任何人都可以点亮导致应用崩溃的原因究竟是什么?
(info:应用程序是一个多线程程序,在多处理器机器中运行约500个线程)
kernel32!RaiseException+53
msvcrt!_CxxThrowException+36
mfc42u!AfxThrowResourceException+19
mfc42u!AfxRegisterWndClass+ab
mfc42u!CAsyncSocket::AttachHandle+5c
mfc42u!CAsyncSocket::Socket+25
mfc42u!CAsyncSocket::Create+14
这同样的问题已经让我疯了,但最后我修复了它,它正在工作。 这是MFC套接字库的错误,当它在一个线程[除了主应用程序线程]内时,如果我们尝试做类似的事情
CSocket socket;
socket.Create();
它会抛出一个未处理的异常。 我发现它的一篇文章中看到微软表示,这个怎么样
那从微软那里说了些什么,但那也没有帮助我。 所以这里有一个解决方法,我找到了,我希望它可以帮助像我这样受挫的人。
内线,做到这一点
CSocket mySock;
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
mySock.m_hSocket= sockethandle;
之后不要调用mySock.Create,因为它已经通过套接字句柄的赋值创建。 我不确定我们是否可以使用mySock.Attach(sockethandle),因为我还没有尝试过。
之后,你可以直接调用Connect等。
当你使用socket时,不要调用mySock.Close()
- 而是调用closesocket(mySock.m_hSocket);
这将释放套接字对象。 如果Attach在上面的情况下工作,那么我想我们需要在这里分离时何时释放套接字。
祝你好运
我想知道这是否是您的实际堆损坏问题,或者您的程序由于使用Pageheap运行而刚刚达到资源限制。
我不记得确切的细节,但Pageheap会导致额外的内存开销,以至于您可能会比没有启用Pageheap时更快地耗尽内存。
在500个线程运行的情况下,每个线程都有一个1MB的堆栈,以及它们沿途动态分配的任何内存。
如果CAsyncSocket::AttachHandle
无法创建窗口,则触发AfxThrowResourceException
。 看起来您的系统由于Pageheap而饱和。
你是否必须运行500个线程才能重现问题? 也许如果你能稍微降低这个数字,那么会有更多的可用资源。
链接地址: http://www.djcxy.com/p/82339.html上一篇: CSocket:: Create throwing exception in my MFC application