MFC 该线程尝试读写某个虚拟地址,而它对该地址不具有相应的访问权限pStringMgr->Reallocate

venhub 2018-08-23 09:43:25
MFC 崩溃dmp查看结果


线程里面socket发送代码如下:

// SocketWinThread.cpp : 实现文件
//

#include "stdafx.h"
#include "KMCarProject.h"
#include "MapWinThread.h"
#include "MapSocket.h"
#include "Global.h"
#include "DBClass.h"
#include "KM3CarProjectDlg.h"
#include "KM2CarProjectDlg.h"



extern CGlobal g_Global;
extern CMapSocket g_MapSocket; //sock连接

CCriticalSection g_socket_cs;



IMPLEMENT_DYNCREATE(CMapWinThread, CWinThread)

CMapWinThread::CMapWinThread()
{


}

CMapWinThread::~CMapWinThread()
{
}

BOOL CMapWinThread::InitInstance()
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

if( InitSocket() == true)
{
LinkTimerID =::SetTimer(NULL, 1, 1000,NULL);
}

return TRUE;
}

int CMapWinThread::ExitInstance()
{

return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CMapWinThread, CWinThread)
END_MESSAGE_MAP()



bool CMapWinThread::InitSocket()
{

try
{
CString str;
g_socket_cs.Lock();
BOOL iret=g_MapSocket.Create(0,SOCK_DGRAM);
g_socket_cs.Unlock();
if(!iret)
{
str.Format("地图服务器连接失败: %d", g_MapSocket.GetLastError());
g_Global.MapErrorContent=str;
return false;
}

g_MapSocket.m_SocketState=1;
return true;
}
catch (...)
{
g_socket_cs.Unlock();
g_Global.MapErrorContent="InitSocket 异常错误";
return false;
}
}





bool CMapWinThread::InitRConnect()
{

try
{
if(g_Global.NetStatus==101)
{
return false;
}
CString str;
g_MapSocket.Close();
BOOL iret=g_MapSocket.Create(0,SOCK_DGRAM);
if(!iret)
{
str.Format("地图服务器连接失败: %d", g_MapSocket.GetLastError());
g_Global.MapErrorContent=str;
g_MapSocket.m_SocketState=-1;
return false;
}
g_Global.MapErrorContent="连接地图成功";
g_MapSocket.m_SocketState=1;

return true;
}
catch (...)
{
g_Global.MapErrorContent="InitRConnect 异常错误";
return false;
}

return true;


}




BOOL CMapWinThread::PreTranslateMessage(MSG* pMsg)
{

if (pMsg->message == WM_TIMER )
{
if(pMsg->wParam ==LinkTimerID)
{
KillTimer(NULL,LinkTimerID);
SendDataID =SetTimer(NULL,1,200,NULL);//400-200
}
else if(pMsg->wParam == ReLinkTimerID)
{

KillTimer(NULL,ReLinkTimerID);
if(InitRConnect() ==false)
{
g_MapSocket.m_SocketState =-1;
ReLinkTimerID =SetTimer(NULL,1,4000*1,NULL);//6s后再检测 6->1
}
else
{
g_Global.MapErrorContent="重连地图成功";
SendDataID =SetTimer(NULL,1,200,NULL);
}
}
else if(pMsg->wParam ==SendDataID)
{

KillTimer(NULL,SendDataID);
if(g_Global.OldGpsContent!=g_Global.NewGpsContent)
{

g_Global.OldGpsContent=g_Global.NewGpsContent;

CString bingcontent="";

try
{

CString signcontent="";
/*signcontent.Format("!%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%.2lf,%s,%d,%s,%s,%s,%s,%d,%d,2,%s,%s,%s,%s,%s,%s,%s",g_Global.m_CarState.FootBrake
,g_Global.m_CarState.ViceBrake,g_Global.m_CarState.HandBrake,g_Global.m_CarState.Horn,g_Global.m_CarState.FrontPass,g_Global.m_CarState.EndPass
,g_Global.m_CarState.WideLamp,g_Global.m_CarState.Engineer,g_Global.m_CarState.BackLamp,g_Global.m_CarState.Clutch,g_Global.m_CarState.GearState
,g_Global.m_CarState.Fire,g_Global.m_CarState.LeftLampOpen,g_Global.m_CarState.RightLampOpen,g_Global.m_CarState.FogLamp,g_Global.m_CarState.FarLamp
,g_Global.m_CarState.NearLamp,g_Global.m_CarState.WiperState,g_Global.m_CarState.SafeBelt,g_Global.m_CarState.DoorLamp,g_Global.m_CarState.GPSSpeed
,g_Global.CarDistance,g_Global.m_CarState.RotateSpeed,g_Global.gps_wxdingweistatus,g_Global.IsProcess,GetAllDateStr(),g_Global.SendStudentSfzhm
,g_Global.m_CarState.WarnLamp,g_Global.CarStopStatus,g_Global.gps_weidu,g_Global.gps_jingdu,g_Global.gps_eastvalue,g_Global.gps_northvalue,
g_Global.gps_fangweijiao,g_Global.gps_fuyangjiao,g_Global.gps_gaodu);*/

CString sFootBrake="";
sFootBrake.Format("%d",g_Global.m_CarState.FootBrake);

CString sViceBrake="";
sViceBrake.Format("%d",g_Global.m_CarState.ViceBrake);

CString sHandBrake="";
sHandBrake.Format("%d",g_Global.m_CarState.HandBrake);

CString sHorn="";
sHorn.Format("%d",g_Global.m_CarState.Horn);


CString sFrontPass="";
sFrontPass.Format("%d",g_Global.m_CarState.FrontPass);


CString sEndPass="";
sEndPass.Format("%d",g_Global.m_CarState.EndPass);


CString sWideLamp="";
sWideLamp.Format("%d",g_Global.m_CarState.WideLamp);

CString sEngineer="";
sEngineer.Format("%d",g_Global.m_CarState.Engineer);


CString sBackLamp="";
sBackLamp.Format("%d",g_Global.m_CarState.BackLamp);


CString sClutch="";
sClutch.Format("%d",g_Global.m_CarState.Clutch);


CString sGearState="";
sGearState.Format("%d",g_Global.MatchGear());

CString sFire="";
sFire.Format("%d",g_Global.m_CarState.Fire);


CString sLeftLampOpen="";
sLeftLampOpen.Format("%d",g_Global.m_CarState.LeftLampOpen);


CString sRightLampOpen="";
sRightLampOpen.Format("%d",g_Global.m_CarState.RightLampOpen);


CString sFogLamp="";
sFogLamp.Format("%d",g_Global.m_CarState.FogLamp);


CString sFarLamp="";
sFarLamp.Format("%d",g_Global.m_CarState.FarLamp);


CString sNearLamp="";
sNearLamp.Format("%d",g_Global.m_CarState.NearLamp);


CString sWiperState="";
sWiperState.Format("%d",g_Global.m_CarState.WiperState);

CString sSafeBelt="";
sSafeBelt.Format("%d",g_Global.m_CarState.SafeBelt);


CString sDoorLamp="";
sDoorLamp.Format("%d",g_Global.m_CarState.DoorLamp);

CString sGPSSpeed="";
sGPSSpeed.Format("%.2lf",g_Global.m_CarState.GPSSpeed);


CString sRotateSpeed="";
sRotateSpeed.Format("%d",g_Global.m_CarState.RotateSpeed);

CString sWarnLamp="";
sWarnLamp.Format("%d",g_Global.m_CarState.WarnLamp);


CString sCarStopStatus="";
sCarStopStatus.Format("%d",g_Global.CarStopStatus);

CString sgps_wxdingweistatus="";
sgps_wxdingweistatus.Format("%d",g_Global.gps_wxdingweistatus);

CString sgps_weidu="";
sgps_weidu.Format("%.2lf",g_Global.gps_weidu);


CString sgps_jingdu="";
sgps_jingdu.Format("%.2lf",g_Global.gps_jingdu);

CString sgps_eastvalue="";
sgps_eastvalue.Format("%.2lf",g_Global.gps_eastvalue);

CString sgps_northvalue="";
sgps_northvalue.Format("%.2lf",g_Global.gps_northvalue);

CString sgps_fangweijiao="";
sgps_fangweijiao.Format("%.2lf",g_Global.gps_fangweijiao);

CString sgps_fuyangjiao="";
sgps_fuyangjiao.Format("%.2lf",g_Global.gps_fuyangjiao);

CString sgps_gaodu="";
sgps_gaodu.Format("%.2lf",g_Global.gps_gaodu);


//!%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%.2lf,%s,%d,%s,%s,%s,%s,%d,%d,2,%s,%s,%s,%s,%s,%s,%s
signcontent="!"+sFootBrake+","+sViceBrake+","+sHandBrake+","+sHorn+","+sFrontPass+","+sEndPass
+","+sWideLamp+","+sEngineer+","+sBackLamp+","+sClutch+","+sGearState
+","+sFire+","+sLeftLampOpen+","+sRightLampOpen+","+sFogLamp+","+sFarLamp
+","+sNearLamp+","+sWiperState+","+sSafeBelt+","+sDoorLamp+","+sGPSSpeed
+","+g_Global.CarDistance+","+sRotateSpeed+","+sgps_wxdingweistatus+","+g_Global.IsProcess+","+GetAllDateStr()+","+g_Global.SendStudentSfzhm
+","+sWarnLamp+","+sCarStopStatus+",2,"+sgps_weidu+","+sgps_jingdu+","+sgps_eastvalue+","+sgps_northvalue+","+
sgps_fangweijiao+","+sgps_fuyangjiao+","+sgps_gaodu;


//!%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%.2lf,%s,%d,%s,%s,%s,%s
g_Global.SendMessageId=(g_Global.SendMessageId)%65535+1;


CString sendxmcontent="";
sendxmcontent=g_Global.SendKsxmStatus;
sendxmcontent.Replace("1-","");
sendxmcontent.Replace("2-","");
sendxmcontent.Replace("3-","");
sendxmcontent.Replace("4-","");
sendxmcontent.Replace("5-","");
sendxmcontent.Replace("6-","");
sendxmcontent.Replace("7-","");
sendxmcontent.Replace("8-","");
sendxmcontent.Replace("9-","");
sendxmcontent.Replace("10-","");
sendxmcontent.Replace("11-","");
sendxmcontent.Replace("12-","");
sendxmcontent.Replace("13-","");
sendxmcontent.Replace("14-","");
sendxmcontent.Replace("15","");
sendxmcontent.Replace("16-","");
sendxmcontent.Replace("17-","");
sendxmcontent.Replace(",","");

CString sendxmingxi="";
sendxmingxi=g_Global.SendKfValueMingxi;
if(sendxmingxi.GetLength()>1)
{
sendxmingxi.Delete(sendxmingxi.GetLength()-1);
}

CString sendkfgpsxuhao="";
sendkfgpsxuhao=g_Global.SendKfValueGpsBh;
if(sendkfgpsxuhao.GetLength()>1)
{
sendkfgpsxuhao.Delete(sendkfgpsxuhao.GetLength()-1);
}
//统计考试过程时间
if(g_Global.IsProcess=="1"||g_Global.IsProcess=="2")//无人开始考试,考试初始化结束
{
g_Global.m_StartTimeTick=GetTickCount();

}
long sumtime=GetTickCount()-g_Global.m_StartTimeTick;
//GPS差分
CString gpschafenstatus="0";
if(g_Global.m_GPSState.GPSFixState==1)
{
gpschafenstatus="1";
}
else
{
gpschafenstatus="2";
}

CString jguancontent="";

CString sSendKfValueSum="";
sSendKfValueSum.Format("%d",g_Global.SendKfValueSum);

CString sSendKfValueCount="";
sSendKfValueCount.Format("%d",g_Global.SendKfValueCount);


CString sSendMessageId="";
sSendMessageId.Format("%ld",g_Global.SendMessageId);

CString ssumtime="";
ssumtime.Format("%ld",sumtime);

jguancontent="&"+sendxmcontent+","+g_Global.SendCurrentXm+","+g_Global.m_CarPlate+","+sSendKfValueSum+","+sSendKfValueCount+","+sendxmingxi+","+g_Global.SendKmType
+","+GetSendTimeDateStr()+","+GetSendTimeDateStr()+","+sSendMessageId+","+g_Global.SendStudentLsh+","+g_Global.SendKsyDabh+","+g_Global.SendKsySfzhm+","+gpschafenstatus
+","+s
...全文
4573 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
venhub 2018-08-24
  • 打赏
  • 举报
回复

引用 5 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
赵四老师 基本看懂了,问个问题 你看上面代码 CSocket.sentto CString变量需要 转成成对于的类型嘛 char * 有些帖子说长度不能直接getllength
赵4老师 2018-08-24
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
venhub 2018-08-24
  • 打赏
  • 举报
回复
这些变量我定义到头文件应该合理把
venhub 2018-08-24
  • 打赏
  • 举报
回复
之前CString.format 转化值的时候会莫名其妙的错误,也不知道哪错了,也没发现转化值哪不对,所有在单独提出来Cstring 我看看_stprintf_s或者sprintf_s比较多 意思你正常用函数?
轻箬笠 2018-08-24
  • 打赏
  • 举报
回复
楼主这查问题的速度很快啊。
不得不说这些string类的确方便了字符串的操作,隐蔽的问题也是不少。所以平时一般用_stprintf_s或者sprintf_s比较多。
venhub 2018-08-24
  • 打赏
  • 举报
回复
还是得看官方文档
赵4老师 2018-08-24
  • 打赏
  • 举报
回复
引用 6 楼 venture10000 的回复:
引用 5 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
赵四老师 基本看懂了,问个问题 你看上面代码 CSocket.sentto CString变量需要 转成成对于的类型嘛 char * 有些帖子说长度不能直接getllength

CString::operator LPCTSTR
operator LPCTSTR ( ) const;

Return Value

A character pointer to the string’s data.

Remarks

This useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.

CString Overview | Class Members | Hierarchy Chart
venhub 2018-08-23
  • 打赏
  • 举报
回复
网上查询了一篇文章,是这样说的
今天在做一个聊天程序时发现一个地方老出错.最后定位到了
CStringData* pNewData = pStringMgr->Reallocate( pOldData, nLength, sizeof( XCHAR ) );
是CString中的一段代码.在网上搜了一下,终于解决了.
具体原因还是没有弄明白,但是解决了,我把程序里面的一段关于CString的Format的代码删掉了,程序就能正常跑起来.
列举一下网上别人的答案:
最典型的一个就是用来描述内存块属性的属性值和实际的值不一致。出现这个问题的原因就是Cstring为了方便某些应用,提供了一些operations,这些operation可以直接返回内存块中的字符串的地址值,用户可以通过对这个地址值指向的地址进行修改,但是,修改后又没有调用相应的operations1使CstringData中的值来保持一致。比如,用户可以首先通过operations得到字符串地址,然后将一些新的字符增加到这个字符串中,使得字符串的长度增加,但是,由于是直接通过指针修改的,所以描述该字符串长度的CstringData中的nDataLength却还是原来的长度,因此当通过GetLength获取字符串长度时,返回的必然是不正确的。
CString占用内存比较大,尤其是循环创建一个CString局部变量时,由于变量是系统自己释放,有时候可能释放的不及时,就容易出问题。所以说在循环里面最好不要创建CString局部变量

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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