断言错误 在ASSERT(m_hObject == NULL)

时间:2021-11-07 18:34:54
在自己的重绘函数中产生这样的断言错误。在重绘函数中创建一个字体,然后在对话框中显示字符串,输出是正确的。但是在程序中增加满足相应条件后就把对话框中的静态文本隐藏后就出现了以上的断言错误,其中静态文本是自定义的类。重绘函数代码如下:
         pDC->SetBkColor(RGB(0,0,0));
pDC->SetTextColor(RGB(128,255,0));
bodyfont.CreatePointFont(124,_T("宋体"),pDC);
pDC->SelectObject(&bodyfont);
for (int i=0;i<25;i++)
{
CPoint pt(35,i*16+80);
CSize sz(720, 16);
CRect rect(pt, sz);
pDC->DrawText(st_data[i],rect,DT_LEFT);
}
bodyfont.DeleteObject();
大家帮忙看看,不甚感激!

17 个解决方案

#1


在堆栈中看是以上哪个语句产生的断言错误。

#2


虽然没看懂LZ的意思
但是你的代码:
pDC->SelectObject(&bodyfont); 
//.....
bodyfont.DeleteObject();
就是有问题的
你应该这样:
CFont* pOldFont = pDC->SelectObject(&bodyfont); 
//...
pDC->SelectObject(pOldFont);
bodyfont.DeleteObject();//如果bodyfont是本地变量, CFont 的实例析构时, 会自动调用, 不用多此一举

#3


引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

#4


引用 2 楼 qifa 的回复:
虽然没看懂LZ的意思
但是你的代码:
pDC->SelectObject(&amp;bodyfont); 
//.....
bodyfont.DeleteObject();
就是有问题的
你应该这样:
CFont* pOldFont = pDC->SelectObject(&amp;bodyfont); 
//...
pDC->SelectObject(pOldFont);
b……

谢谢,这样我也试过了,但是还是有问题!如果没有隐藏静态文本控件的时候输出是正确的,但是当隐藏控件后,才有这个断言……

#5


换个字体行吗?

#6


光从你贴出来的代码, 看不出什么问题, 既然出现断言失败, 你看看调用堆栈, 问题的出现是在哪个函数, 哪条语句, 贴出相关代码出来看看

#7


引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

#8


引用 5 楼 jennyvenus 的回复:
换个字体行吗?

这个倒没试过,试试看……

#9


引用 6 楼 qifa 的回复:
光从你贴出来的代码, 看不出什么问题, 既然出现断言失败, 你看看调用堆栈, 问题的出现是在哪个函数, 哪条语句, 贴出相关代码出来看看

是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长……

#10


引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

没有耶!

#11


我估计bodyfont.CreatePointFont(124,_T("宋体"),pDC);根本就是失败的,你不检查返回值就直接使用,是非常危险的
至少写成
if(!bodyfont.CreatePointFont(124,_T("宋体"),pDC))
{
       TRACE(_T("Cannot create fond:%d\n"), GetLastError());
       return;
}

另外:这个函数的第一个参数应该是实际高度的10倍,124不是10的整数倍,是不撒有问题?

#12


确保bodyfont是临时变量,不要是类成员变量或者static变量
引用 10 楼 xue_yang 的回复:
引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

没有耶!

#13


是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长
============
即使这样也不一定就能断定是那三条语句的问题。

#14


引用 12 楼 arong1234 的回复:
确保bodyfont是临时变量,不要是类成员变量或者static变量

引用 10 楼 xue_yang 的回复:
引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是……

谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢!

#15


引用 13 楼 wltg2001 的回复:
是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长
============
即使这样也不一定就能断定是那三条语句的问题。

应该是的,因为在堆栈中调试是bodyfont的object不是NULL

#16


因为如果你使用类成员对象,你就必须确保在使用前DeleteObject倍调用成功。恐怕你函数在DeleteObject方面有可能失败或者根本没调用过
引用 14 楼 xue_yang 的回复:
引用 12 楼 arong1234 的回复:
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢

#17


[Quote=引用 16 楼 arong1234 的回复:]
因为如果你使用类成员对象,你就必须确保在使用前DeleteObject倍调用成功。恐怕你函数在DeleteObject方面有可能失败或者根本没调用过

引用 14 楼 xue_yang 的回复:
引用 12 楼 arong1234 的回复:
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢
[/Quo]
谢谢雷人!问题解决,正如你所说,分都给你了。

#1


在堆栈中看是以上哪个语句产生的断言错误。

#2


虽然没看懂LZ的意思
但是你的代码:
pDC->SelectObject(&bodyfont); 
//.....
bodyfont.DeleteObject();
就是有问题的
你应该这样:
CFont* pOldFont = pDC->SelectObject(&bodyfont); 
//...
pDC->SelectObject(pOldFont);
bodyfont.DeleteObject();//如果bodyfont是本地变量, CFont 的实例析构时, 会自动调用, 不用多此一举

#3


引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

#4


引用 2 楼 qifa 的回复:
虽然没看懂LZ的意思
但是你的代码:
pDC->SelectObject(&amp;bodyfont); 
//.....
bodyfont.DeleteObject();
就是有问题的
你应该这样:
CFont* pOldFont = pDC->SelectObject(&amp;bodyfont); 
//...
pDC->SelectObject(pOldFont);
b……

谢谢,这样我也试过了,但是还是有问题!如果没有隐藏静态文本控件的时候输出是正确的,但是当隐藏控件后,才有这个断言……

#5


换个字体行吗?

#6


光从你贴出来的代码, 看不出什么问题, 既然出现断言失败, 你看看调用堆栈, 问题的出现是在哪个函数, 哪条语句, 贴出相关代码出来看看

#7


引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

#8


引用 5 楼 jennyvenus 的回复:
换个字体行吗?

这个倒没试过,试试看……

#9


引用 6 楼 qifa 的回复:
光从你贴出来的代码, 看不出什么问题, 既然出现断言失败, 你看看调用堆栈, 问题的出现是在哪个函数, 哪条语句, 贴出相关代码出来看看

是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长……

#10


引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

没有耶!

#11


我估计bodyfont.CreatePointFont(124,_T("宋体"),pDC);根本就是失败的,你不检查返回值就直接使用,是非常危险的
至少写成
if(!bodyfont.CreatePointFont(124,_T("宋体"),pDC))
{
       TRACE(_T("Cannot create fond:%d\n"), GetLastError());
       return;
}

另外:这个函数的第一个参数应该是实际高度的10倍,124不是10的整数倍,是不撒有问题?

#12


确保bodyfont是临时变量,不要是类成员变量或者static变量
引用 10 楼 xue_yang 的回复:
引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

没有耶!

#13


是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长
============
即使这样也不一定就能断定是那三条语句的问题。

#14


引用 12 楼 arong1234 的回复:
确保bodyfont是临时变量,不要是类成员变量或者static变量

引用 10 楼 xue_yang 的回复:
引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是……

谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢!

#15


引用 13 楼 wltg2001 的回复:
是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长
============
即使这样也不一定就能断定是那三条语句的问题。

应该是的,因为在堆栈中调试是bodyfont的object不是NULL

#16


因为如果你使用类成员对象,你就必须确保在使用前DeleteObject倍调用成功。恐怕你函数在DeleteObject方面有可能失败或者根本没调用过
引用 14 楼 xue_yang 的回复:
引用 12 楼 arong1234 的回复:
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢

#17


[Quote=引用 16 楼 arong1234 的回复:]
因为如果你使用类成员对象,你就必须确保在使用前DeleteObject倍调用成功。恐怕你函数在DeleteObject方面有可能失败或者根本没调用过

引用 14 楼 xue_yang 的回复:
引用 12 楼 arong1234 的回复:
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢
[/Quo]
谢谢雷人!问题解决,正如你所说,分都给你了。