请问同一程序同时打开的两个实例 是否有共享内存??

zoro9527 2014-10-31 11:37:09
该程序中有动态内存的创建和释放,如果同时打开两个实例是否会造成内存的非法访问?
...全文
186 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoro9527 2014-11-06
  • 打赏
  • 举报
回复
引用 9 楼 xian_wwq 的回复:
[quote=引用 8 楼 zoro9527 的回复:] 针对前面提到的代码,出现“0xC0000005: Access Violation”这样的问题,具体是什么原因,应该怎么解决,有朋友能够告诉我吗???
这个错误一般都是指针非法, 多线程访问全局变量必须要处理同步,加上临界区锁[/quote] 非常感谢这位大哥解决了我困惑已久的问题,虽然还没想明白是什么原因,但通过将全局变量g_cmdList加锁后确实就好了。 EnterCriticalSection(&g_cs); ...... LeaveCriticalSection(&g_cs); 之前也想到过加互斥锁,只是加的地方不对。
笨笨仔 2014-11-05
  • 打赏
  • 举报
回复
只要实例中没有static变量就不会出现内存冲突。
xian_wwq 2014-11-05
  • 打赏
  • 举报
回复
引用 8 楼 zoro9527 的回复:
针对前面提到的代码,出现“0xC0000005: Access Violation”这样的问题,具体是什么原因,应该怎么解决,有朋友能够告诉我吗???
这个错误一般都是指针非法, 多线程访问全局变量必须要处理同步,加上临界区锁
zoro9527 2014-11-03
  • 打赏
  • 举报
回复
针对前面提到的代码,出现“0xC0000005: Access Violation”这样的问题,具体是什么原因,应该怎么解决,有朋友能够告诉我吗???
Saleayas 2014-10-31
  • 打赏
  • 举报
回复
不会的。 因为进程的内存分配是在进程内的私有堆上的。 如果需要共享,必须使用专门的处理。
linux_hsylar 2014-10-31
  • 打赏
  • 举报
回复
一个程序的不同实例会创建不同的内存空间,他们有不同的堆栈空间,就算是动态内存创建也不会影响对方。
zoro9527 2014-10-31
  • 打赏
  • 举报
回复
[quote=引用 5 楼 smilecabbage 的回复:] 就在你子进程收发的时候出的问题。不能同不好。 [/quo 这位大哥能不能麻烦您说得清楚一点??? 您说的“不能同不好”是什么意思? 是不是多线程下不能这样跨线程动态创建与释放内存????
smilecabbage 2014-10-31
  • 打赏
  • 举报
回复
就在你子进程收发的时候出的问题。不能同不好。
zoro9527 2014-10-31
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
应该还是你单个进程处理对象有问题
单独运行一个实例都好好的,调了好久也找不到原因,我也觉得应该是程序处理上的问题。 请问各位大哥这种问题可能出在哪里啊???
oyljerry 2014-10-31
  • 打赏
  • 举报
回复
应该还是你单个进程处理对象有问题
zoro9527 2014-10-31
  • 打赏
  • 举报
回复
我这个程序现在有两个线程: 主线程中有个定时器定时往链表中添加数据 子线程从链表中取出数据实现串口的收发 现在的问题是如果同时打开两个软件实例运行一段时间后程序会异常终止抛出 0xC0000005: Access Violation 主线程主要代码: CObList g_cmdList;//全局变量 if(nIDEvent == 2 && g_cmdList.IsEmpty()) { WORD crcDat = 0; int nIndex = 0; SEND_CMD *psendCmd = new SEND_CMD; memset(psendCmd,0,sizeof(SEND_CMD)); psendCmd->databuf[nIndex++] = (BYTE)m_devAddr; psendCmd->databuf[nIndex++] = 0x03; psendCmd->databuf[nIndex++] = 0x00; psendCmd->databuf[nIndex++] = 0x00; psendCmd->databuf[nIndex++] = 0x00; psendCmd->databuf[nIndex++] = 0x1b; crcDat = cal_crc(psendCmd->databuf,6); psendCmd->databuf[nIndex++] = LOBYTE(crcDat); psendCmd->databuf[nIndex++] = HIBYTE(crcDat); psendCmd->len = 8; g_cmdList.AddTail((CObject*)psendCmd); for(int i=0;i<16;i++) { psendCmd = new SEND_CMD; nIndex = 0; //psendCmd->databuf[nIndex++] = (BYTE)m_devAddr; psendCmd->databuf[nIndex++] = 0xeb; psendCmd->databuf[nIndex++] = 0x90; psendCmd->databuf[nIndex++] = 0xeb; psendCmd->databuf[nIndex++] = 0x90; psendCmd->databuf[nIndex++] = 0x08; psendCmd->databuf[nIndex++] = 0x00; psendCmd->databuf[nIndex++] = 0x00; psendCmd->databuf[nIndex++] = i;//addr psendCmd->databuf[nIndex++] = 0x00; psendCmd->databuf[nIndex++] = 0x10; crcDat = cal_crc(psendCmd->databuf+4,6); psendCmd->databuf[nIndex++] = LOBYTE(crcDat); psendCmd->databuf[nIndex++] = HIBYTE(crcDat); psendCmd->len = 12; g_cmdList.AddTail((CObject*)psendCmd); } } 子线程主要代码: SEND_CMD *pCmd = 0; while(1) { if(!g_cmdList.IsEmpty()) { pCmd = (SEND_CMD*)g_cmdList.RemoveHead(); } else { Sleep(10); continue; } if(pCmd) { g_comm.WriteCommBlock(pCmd->databuf,pCmd->len); delete pCmd; pCmd = NULL; } if(g_comm.ReceiveData()) { parseRecvData(g_RecvBuf); } else { Sleep(1); } }

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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