关于Debug和Release(实在搞不定了,请高手指教)

时间:2021-09-30 03:29:42
我建了一个project,有一个线程向CFormView发送自定义的消息,在CFormView中有相应的消息处理函数。在Debug下一切正常,但是在Release中运行的时候说:

"0x6bc41351"指令引用的"0x00000490"内存,该内存不能为"read"。

代码我也该过,只要把线程中发消息的那行注释掉,或者去掉消息处理函数,就正常了。但是我试过把消息处理函数改为的内容改为空(即直接返回不做任何事情)还是不行,百思不得其解。

然后,我又一个一个尝试过了几乎所有编译的参数,最后发现只要将预处理定义(preprocessor definitions)中的NDEGBU改成_DEBUG(就是在主菜单下project/setting/c++里的preprocessor definitions编辑框)就一切正常,请问这是什么原因?该怎么解决?

还有NDEBUG和_DEBUG究竟有什么具体的不同之处?请高手指教,小弟感激之至。
如果分数不够,还可以再加,不懂的话,就帮我UP一下吧!

10 个解决方案

#1


多半是由于内存数据没有初始化或是数组下标出界等造成地。

#2


你在debug版编译时,打开/W4开关,看看有哪些警告信息,逐条解决,再到Release下编译运行看看.

#3


同意上面两位仁兄。继续关注。

#4


还有一个可能是使用delete来删除已被删除的指针

#5


还是不行啊

#6


http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1760

#7


http://www.csdn.net/expert/topic/712/712974.xml

#8


通常DEBUG下能用,但RELEASE下不能用的原因有下列:

1、变量没有初始化,在DEBUG下是自动初始化的。
2、分配的内存没有置0,例如 char *pchBuff = new char[1024];
ZeroMemory(pchBuff,sizof(pchBuff));在没有初始化的情况下,比较内存,DEBUG下是成功的,RELEASE下就是随机的了。
3、参数传递时,忽略了变量的生存周期。这也是往往DEBUG下能运行,而RELEASE下不能运行的。你出现的问题可能就是这个原因。

例如:

  Cxxxxx::Dealsome()
{
   int nTemp = 101*1024;
   AfxBeginThread(DoThread,(LPVOID)&nTemp);
}

这段代码在DEBUG下运行正常,但到了RELEASE下就会随机的错误,为什么?

因为DoThread()函数是在另一个线程中运行的,那个函数运行的时候,局部变量nTemp的地址已经失效了,当然是非法操作了,WINDOWS API中有很多函数的返回值都是临时的,在MSDN中都有警告,不能保存下来使用,例如:

CMenu* GetSubMenu( int nPos ) const;

Return Value

A pointer to a CMenu object whose m_hMenu member contains a handle to the pop-up menu if a pop-up menu exists at the given position; otherwise NULL. If a CMenu object does not exist, then a temporary one is created. The CMenu pointer returned should not be stored.

这样的函数,如果你在DEBUG中使用,有时是正常的,在RELEASE中使用偶尔也能正确,看了我上边的解释,你就明白为什么了。

我想,DEBUG下能运行,可能是因为nTemp变量地址失效以前,线程函数已经完成运行退出了,而RELEASE下,可能在线程函数开始运行的时候,nTemp地址已经失效了,因为局部变量在堆栈中分配的,函数返回以后,这个堆栈也就弹出了。变量相应的也被销毁了,原来的那个地址也就无意义了。

#9


楼上的已经说得很清楚了!应该可以解决了吧?

#10


多谢各位拔刀相助,小弟感激不尽!问题已经解决了。散分散分!

#1


多半是由于内存数据没有初始化或是数组下标出界等造成地。

#2


你在debug版编译时,打开/W4开关,看看有哪些警告信息,逐条解决,再到Release下编译运行看看.

#3


同意上面两位仁兄。继续关注。

#4


还有一个可能是使用delete来删除已被删除的指针

#5


还是不行啊

#6


http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1760

#7


http://www.csdn.net/expert/topic/712/712974.xml

#8


通常DEBUG下能用,但RELEASE下不能用的原因有下列:

1、变量没有初始化,在DEBUG下是自动初始化的。
2、分配的内存没有置0,例如 char *pchBuff = new char[1024];
ZeroMemory(pchBuff,sizof(pchBuff));在没有初始化的情况下,比较内存,DEBUG下是成功的,RELEASE下就是随机的了。
3、参数传递时,忽略了变量的生存周期。这也是往往DEBUG下能运行,而RELEASE下不能运行的。你出现的问题可能就是这个原因。

例如:

  Cxxxxx::Dealsome()
{
   int nTemp = 101*1024;
   AfxBeginThread(DoThread,(LPVOID)&nTemp);
}

这段代码在DEBUG下运行正常,但到了RELEASE下就会随机的错误,为什么?

因为DoThread()函数是在另一个线程中运行的,那个函数运行的时候,局部变量nTemp的地址已经失效了,当然是非法操作了,WINDOWS API中有很多函数的返回值都是临时的,在MSDN中都有警告,不能保存下来使用,例如:

CMenu* GetSubMenu( int nPos ) const;

Return Value

A pointer to a CMenu object whose m_hMenu member contains a handle to the pop-up menu if a pop-up menu exists at the given position; otherwise NULL. If a CMenu object does not exist, then a temporary one is created. The CMenu pointer returned should not be stored.

这样的函数,如果你在DEBUG中使用,有时是正常的,在RELEASE中使用偶尔也能正确,看了我上边的解释,你就明白为什么了。

我想,DEBUG下能运行,可能是因为nTemp变量地址失效以前,线程函数已经完成运行退出了,而RELEASE下,可能在线程函数开始运行的时候,nTemp地址已经失效了,因为局部变量在堆栈中分配的,函数返回以后,这个堆栈也就弹出了。变量相应的也被销毁了,原来的那个地址也就无意义了。

#9


楼上的已经说得很清楚了!应该可以解决了吧?

#10


多谢各位拔刀相助,小弟感激不尽!问题已经解决了。散分散分!