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

下一篇: Heap corruption c++ Function to return a table pointer