积极答复者
内存处理异常

问题
-
LPVOID m_lpBuffer; LPBYTE m_lpBufferPos; int m_nBufferSize; struct msg_define { WORD messageLen; WORD messageTepyid; int recievemessageLen; }; struct recieve_message { BYTE byMessageId; std::string strMessageInfo; }; std::map<BYTE,std::string> mapMessageInfo; // nSize : 表示消息的总长度,msg_define: 表示消息结构体 void ProcessRecieveMessage(int nSize,msg_define* pHeader) { m_nBufferSize = nSize - sizeof(msg_define); if (m_lpBuffer) { delete []m_lpBuffer; m_lpBuffer = 0; } m_lpBuffer = new BYTE[pHeader->messageLen]; m_lpBufferPos = static_cast<LPBYTE>(m_lpBuffer); CopyMemory(m_lpBufferPos,pHeader + 1,m_nBufferSize); mapMessageInfo.clear(); size_t count = (size_t)m_nBufferSize/sizeof(recieve_message); recieve_message* pRecieveMessage = static_cast<recieve_message*>(m_lpBuffer); for (size_t i = 0; i < count; i++, pRecieveMessage++) mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo; } // 当结构体msg_define消息缓存区里面的内容为 // 1(byMessageId),"四字成语"(strMessageInfo),2(byMessageId),“一惊一乍”(strMessageInfo)…… // 这个模式(字节数一样),上面的语句运行的时候不会报错 // 但是当改成1(byMessageId),"四字"(strMessageInfo),2(byMessageId),“一惊一乍”(strMessageInfo)…… // 这种模式(字节数不一样且是汉字的时候),运行的时候会提示内存错误 (好像如果是英文的话,不会报错) // 不知道是为什么??? 请指教。
答案
-
怀疑是m_lpBuffer = new BYTE[pHeader->messageLen];
这句pHeader->messageLen太大了,导致无法分配内存。
麻烦把正确答案设为解答。- 已标记为答案 SplendourGModerator 2011年3月16日 14:59
-
同意SplendourG的说法,这个可能是由于new操作失败抛出的异常。如果new操作失败的话,在Visual C++ .NET下,非MFC项目会抛出std::bad_alloc异常,MFC的项目会抛出CMemoryException异常。原因可能是pHeader->messageLen太大或者是它本身就没有被赋值。
可以参考一下MSDN的文章:
http://msdn.microsoft.com/en-us/magazine/cc164087.aspx
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.- 已标记为答案 SplendourGModerator 2011年3月16日 14:59
-
异常是在mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo;这一句抛的呢,还是在new BYTE[pHeader->messageLen];这一句抛的?你这里好像就这两句能抛std::bad_alloc异常。
异常是在mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo;这一句
在这两句上加个断点试试,看看是那一句抛的。
另外,是不是改了以后总是会抛异常,而原来那样就不抛呢?
另外,直接从二进制流里面摘对象也太危险了,不能用别的办法吗?
LHL
每次都是在 i = count - 1 的时候,就抛出异常了。do{ } while((malloc(size) == NULL));
哈哈,真是这么写的,你在release模式下到汇编窗口下单步调试进入new函数后就是这样的。
LHL- 已标记为答案 SplendourGModerator 2011年3月16日 15:00
全部回复
-
怀疑是m_lpBuffer = new BYTE[pHeader->messageLen];
这句pHeader->messageLen太大了,导致无法分配内存。
麻烦把正确答案设为解答。- 已标记为答案 SplendourGModerator 2011年3月16日 14:59
-
同意SplendourG的说法,这个可能是由于new操作失败抛出的异常。如果new操作失败的话,在Visual C++ .NET下,非MFC项目会抛出std::bad_alloc异常,MFC的项目会抛出CMemoryException异常。原因可能是pHeader->messageLen太大或者是它本身就没有被赋值。
可以参考一下MSDN的文章:
http://msdn.microsoft.com/en-us/magazine/cc164087.aspx
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.- 已标记为答案 SplendourGModerator 2011年3月16日 14:59
-
异常是在mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo;这一句抛的呢,还是在new BYTE[pHeader->messageLen];这一句抛的?你这里好像就这两句能抛std::bad_alloc异常。
异常是在mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo;这一句
在这两句上加个断点试试,看看是那一句抛的。
另外,是不是改了以后总是会抛异常,而原来那样就不抛呢?
另外,直接从二进制流里面摘对象也太危险了,不能用别的办法吗?
LHL
每次都是在 i = count - 1 的时候,就抛出异常了。 -
异常是在mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo;这一句抛的呢,还是在new BYTE[pHeader->messageLen];这一句抛的?你这里好像就这两句能抛std::bad_alloc异常。
异常是在mapMessageInfo[pRecieveMessage->byMessageId] = pRecieveMessage->strMessageInfo;这一句
在这两句上加个断点试试,看看是那一句抛的。
另外,是不是改了以后总是会抛异常,而原来那样就不抛呢?
另外,直接从二进制流里面摘对象也太危险了,不能用别的办法吗?
LHL
每次都是在 i = count - 1 的时候,就抛出异常了。do{ } while((malloc(size) == NULL));
哈哈,真是这么写的,你在release模式下到汇编窗口下单步调试进入new函数后就是这样的。
LHL- 已标记为答案 SplendourGModerator 2011年3月16日 15:00
-
结构体 struct recieve_message 中的成员 std::string strMessageInfo,不是一个简单内存块对象。
它不可以用recieve_message* pRecieveMessage = static_cast<recieve_message*>(m_lpBuffer); 这样的方式访问。
简单的举一个例子:
BYTE buffer[256] = {'\0','1','2','3','4',0};
recieve_message* pRecieveMessage = static_cast<recieve_message*>(buffer);pReceiveMessgae->strMessageInfo 并不保证是 "1234"这个字符串。 这与std::string对象的实现有关。
如果你测试的话,也许碰巧是,但是,如果你再继续填充buffer的内容到足够的长度,将肯定得到其它的结果。