一个奇怪的bug:
我在一个绘图系统中,设计了一个CLineItem类,其中有个记录数据的缓冲区m_pBuffer,在构造函数中有m_pBuffer= new float(m_lSize),而后我想将其清空,于是调用InitBuffer(),代码为
if (m_pBuffer)
{
delete []m_pBuffer;
m_pBuffer=NULL;
}
m_pBuffer= new float(m_lSize);
但退出程序,在析构函数释放内存时
if (m_pBuffer)
{
delete []m_pBuffer;
m_pBuffer=NULL;
}
发生Assertion,跟踪Debug发现m_pBuffe原来的地址为0X01809918在InitBuffer()中delete之后用new分配的地址为0X01808038,但在析构函数中释放内存时地址仍为0X01809918,就是说对已经释放的地址再调用delete当然会有Assertion发生。从代码上看没有什么问题,但不明白怎么会造成这样,请各位大仙帮帮忙,谢谢。
我在一个绘图系统中,设计了一个CLineItem类,其中有个记录数据的缓冲区m_pBuffer,在构造函数中有m_pBuffer= new float(m_lSize),而后我想将其清空,于是调用InitBuffer(),代码为
if (m_pBuffer)
{
delete []m_pBuffer;
m_pBuffer=NULL;
}
m_pBuffer= new float(m_lSize);
但退出程序,在析构函数释放内存时
if (m_pBuffer)
{
delete []m_pBuffer;
m_pBuffer=NULL;
}
发生Assertion,跟踪Debug发现m_pBuffe原来的地址为0X01809918在InitBuffer()中delete之后用new分配的地址为0X01808038,但在析构函数中释放内存时地址仍为0X01809918,就是说对已经释放的地址再调用delete当然会有Assertion发生。从代码上看没有什么问题,但不明白怎么会造成这样,请各位大仙帮帮忙,谢谢。
解决方案 »
- 如何用 WaitForSingleObject 等待100天? 49天后, 系统何去何从?
- 关于VC对话框外观的问题!
- 怎么删除一个类
- ADO访问ACCESS数据库,如何才能够设计两个搜索条件?
- 再问QQ,有兴趣的朋友进来聊聊:以前有网友说,QQ的传输是通过TCP方式,我觉得有点不可能,QQ怎么能够在两个内网的客户端之间建立连接呢
- 过年了,还是有一个简单问题好象用SQL语句写不出来,大家帮忙看看?
- 如何改变鼠标的图形(例如十字形)
- 有关在VC中做一个类似debug状态下memory窗口的问题。来者有分。
- Crystal Report in VC++
- 对一个按钮,默认时只处理BN_CLICK和BN_DBCLICK,如果要处理其它消息,该怎么办?
- 两个控件不会操作,MS DataGrid、MS ADC。请大家帮忙。
- 初学VC 问个菜鸟问题
memset(m_pBuffer, sizeof(float)*m_lSize);
2. 自定义消息及其他声明的标准写法
3. 使用调试宏时使用后最好注释掉
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。
上面一句明显有问题,作者的目的是要申请一个m_lSize个float类的变量,应该这样写
m_pBuffer = new float[m_lSize];用new 申请的内存用delete[]来释放,当然会出错。
这是我贴帖子的笔误,不是程序的问题.或许是我程序的问题,但我查了很久都没有发现,回复kingyo(钝刀)
m_pBuffe原来的地址为0X01809918在InitBuffer()中delete之后用new分配的地址为0X01808038,但在析构函数中释放内存时地址仍为0X01809918为什么在InitBuffer中重新分配后是0x01808038,等你析构时它还是0x01809918??
这是我单步调试时发现的,我也不明白为什么,程序运行到这里就异常.释放内存的问题,我用一个很笨的方法避免了异常,下次我把完整的代码贴上,大家帮忙看看.