vs2005,release版本直接运行(或ctrl+F5),delete[] 出错

春天到了冬天还远吗 2011-04-15 11:03:32
debug(F5、Ctrl+f5、直接运行)及release F5运行都不会出问题

我的程序是个dll,里面开了个线程,外面提交命令。线程内部取出命令并处理,下面是代码:


//提交命令,由外面调用
void CCmd::PostCmd(int nCmdType, void* pCmdData, int nCmdLength)
{
if(!pCmdData || nCmdLength<1)
return;

CAutoLock al(&m_csListCmd);

TRACE(, "提交一条命令,命令类型为%d,长度为%d", nCmdType, nCmdLength);

//创建新的命令
PCMD pCmd = new CMD;
pCmd->nCmdType = nCmdType;
pCmd->pCmdData = new BYTE[nCmdLength];
memcpy(pCmd->pCmdData, pCmdData, nCmdLength);
pCmd->nCmdLength = nCmdLength;

//将命令添加到列队
m_listCmd.push_front(pCmd);
}


//处理事件 在线程函数里调用
void CCmd::ProcessCmd()
{
CAutoLock al(&m_csListCmd);

if(m_listCmd.empty())
return;

//取出一条命令
PCMD pCmd = m_listCmd.back();
m_listCmd.pop_back();

TRACE("收到一条命令,命令类型为%d,长度为%d", pCmd->nCmdType, pCmd->nCmdLength);

//分析命令
switch(pCmd->nCmdType)
{
/*处理命令**/
}
TRACE("删除命令前");

//销毁命令
delete []pCmd->pCmdData;
TRACE("删除命令中");
delete pCmd;
TRACE("删除命令");
}


出错在 “delete []pCmd->pCmdData;”这一句,因为我用DebugView看的时候
打印“删除命令前"后程序就死了

是啥原因呢
...全文
214 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 pengzhixi 的回复:]
dll,new的内存当然是dll释放,这点毫无疑问,但是说dll中不能使用new delete这个是没有根据的,只是说在使用dll的时候在选择MT这方面要注意。使用dll的应用程序和dll这方面的选项应该是要一致的
[/Quote]
这些都不太懂,有时间去研究研究

PostCmd是外面调的
ProcessCmd是dll的线程函数调的
pengzhixi 2011-04-15
  • 打赏
  • 举报
回复
dll,new的内存当然是dll释放,这点毫无疑问,但是说dll中不能使用new delete这个是没有根据的,只是说在使用dll的时候在选择MT这方面要注意。使用dll的应用程序和dll这方面的选项应该是要一致的
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mdl13412 的回复:]
代码我没看,但是你既然是写dll,那么就不能用new和delete,你只能用API,HeapAlloc分配
[/Quote]
这个启发我了,反正用HeapAlloc、HeapFree没问题
[Quote=引用 22 楼 xiaohuh421 的回复:]
注意,dll中申请的内存到dll外释放会有问题的,一般来说要是"谁申请,谁释放"
[/Quote]
可能是这个意思,

不过不好解释为啥debug、Release f5执行没问题

另外,我的dll是给一个ocx(activex)用的,这个ocx又是放到网页里用的
xiaohuh421 2011-04-15
  • 打赏
  • 举报
回复
注意,dll中申请的内存到dll外释放会有问题的,一般来说要是"谁申请,谁释放"
pengzhixi 2011-04-15
  • 打赏
  • 举报
回复
18L代码注释掉memcpy(pCmd->pCmdData, pCmdData, nCmdLength);再试试
  • 打赏
  • 举报
回复
少了个 [] ,不过加上也是错
  • 打赏
  • 举报
回复
//创建新的命令
PCMD pCmd = new CMD;
pCmd->nCmdType = nCmdType;
pCmd->pCmdData = new BYTE[nCmdLength];
memcpy(pCmd->pCmdData, pCmdData, nCmdLength);
pCmd->nCmdLength = nCmdLength;

TRACE("sip", "%x", pCmd->pCmdData);
delete pCmd->pCmdData;
TRACE("sip", "delete成功");


这样都不行。。。
  • 打赏
  • 举报
回复
就是普通的结构体呀
pengzhixi 2011-04-15
  • 打赏
  • 举报
回复
PCMD这个类型有没有析构函数呢?如果有又是什么
  • 打赏
  • 举报
回复
悲剧,我直接在PostCmd里申请后删除都不行。。。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pengzhixi 的回复:]
switch(pCmd->nCmdType)
{
/*处理命令**/
}
这里面的代码贴出来,另外dll中尽量别用stl中的东西。
[/Quote]
把switch都注释了。。
不用stl,那咋办,我考虑用window的消息列队了,都不用同步了
PostThreadMessage
PeekMessage
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengzhixi 的回复:]
把使用过pCmd->pCmdData的代码贴出来看下
[/Quote]
我把使用过的地方注释了,也就是switch部分 也有问题


[Quote=引用 10 楼 mdl13412 的回复:]
代码我没看,但是你既然是写dll,那么就不能用new和delete,你只能用API,HeapAlloc分配
[/Quote]
不会吧,好像没这个约定吧

[Quote=引用 12 楼 cs_dn_sniper 的回复:]
pCmd是局部变量吧,为什么在CCmd::PostCmd里new
CCmd::ProcessCmd里delete
[/Quote]
这个应该不是问题。。动态申请就是这么用的
三文鱼也会飞 2011-04-15
  • 打赏
  • 举报
回复
pCmd是局部变量吧,为什么在CCmd::PostCmd里new
CCmd::ProcessCmd里delete
pengzhixi 2011-04-15
  • 打赏
  • 举报
回复
switch(pCmd->nCmdType)
{
/*处理命令**/
}
这里面的代码贴出来,另外dll中尽量别用stl中的东西。
凝霜 2011-04-15
  • 打赏
  • 举报
回复
代码我没看,但是你既然是写dll,那么就不能用new和delete,你只能用API,HeapAlloc分配
pengzhixi 2011-04-15
  • 打赏
  • 举报
回复
把使用过pCmd->pCmdData的代码贴出来看下
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wtx_sonery 的回复:]

引用 4 楼 pengzhixi 的回复:

1.检查是否有代码修改了pCmd->pCmdData;这个指针。2.release下设置下MT

1、打印过值,发现没被改。。。2,是试下
[/Quote]
设置了MT也不行。。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

1.检查是否有代码修改了pCmd->pCmdData;这个指针。2.release下设置下MT
[/Quote]
1、打印过值,发现没被改。。。2,是试下
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dobzhansky 的回复:]

有操作 pCmdData 中的东西么
[/Quote]
有。。。switch里面省略里的有访问

[Quote=引用 2 楼 hhh_hao 的回复:]

既然是多线程m_listCmd的push和pop必须加个临界区保护
[/Quote]
有加
CAutoLock al(&m_csListCmd);
pengzhixi 2011-04-15
  • 打赏
  • 举报
回复
1.检查是否有代码修改了pCmd->pCmdData;这个指针。2.release下设置下MT
加载更多回复(6)

64,637

社区成员

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

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