我遇到几个怪问题,哪位高手帮帮我?我快要疯了!!!!!

xiaoy 2001-07-07 09:37:32
对不起,只有这么多分了。
1、为什么我在用SDK编程时,不能用new、delete?而我用malloc,free时又会出错。我已经把<memory.h><malloc.h>几个文件包进来了。
2、我想做一个字符串类,以代替CString在SDK编程时方便用字符操作,但用SDK编程时(不用VC的向导,而是全部代码自己写)居然不能用,这个类是没问题的,如果用VC的向导产生一个SDK框架,这个类不动一个字母,就没事了。
3、还是上面这个类,请看下述代码及后面的说明:
CStr CStr::Left(int nLen)
{
if(_nLen<nLen || nLen<0)throw("Error string length");

CStr sTemp;
delete sTemp._p;  //_p为类的private,保存实际的字符串。

sTemp._nLen=nLen+1; //_nLen为类的private,保存字符串长度
sTemp._p=new char[sTemp._nLen];

for(int i=0;i<nLen;i++){
sTemp._p[i]=_p[i];
}
sTemp._p[i]='\0';  //到这里的时候,sTemp还是一个有效的字符串

return sTemp;   //到这里,sTemp就已经变为空串了。
}
4、编程时我用了一个函数,它有三个参数:(HDC hdc,int nFrom,int nAngle),在运行到该函数时,我发现,在刚进入函数时,hdc,nFrom,nAngle三个数还是一个有效的值,可是运行几步后,这三个值居然全部为零了。
5、有一个程序,运行几分钟后就不能刷新了,而且这时系统也变得极不稳定,我查看系统资源,发现只要这个程序WM_UPDATE一次,可用内存就减少一点,而已分配内存不变,这是不是就叫内存泄漏?怎样才能检查内存泄漏?
6、用SDK编程,我处理了WM_ERASEBKGRND消息,但是却不能改变window的背景,如果是基于dialog的程序,倒是可以改变背景。而且,对于一般的程序,窗口在启动时,它把原来screen上的内容弄到它的client里做背景了。我怎么样才能自己处理背景呢?按照MSDN的解释,要返回非零值,可是我返回1不行,返回 HBRUSH 也不行。

...全文
158 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoy 2001-07-12
  • 打赏
  • 举报
回复
谢谢各位!
我先试试。
Elminster 2001-07-09
  • 打赏
  • 举报
回复
2、请问你有没有把你写的类文件引入工程?
3、…… 说什么好呢?大哥啊,那个 sTemp 是你在这个函数里声明的局部变量啊,到了 return 的时候,这个对象会被调用析构函数然后销毁,空串是当然的。
4、请问每次都是到同一步变为 0 的吗?还是每次在不同地方?
nustchen 2001-07-09
  • 打赏
  • 举报
回复
4、肯定是你的代码里改动了值,把你数组赋值后面的代码都屏蔽掉试一下,应该不会有问题。
5、你用了MemDC没有,记得要DeleteObject
6、说明你的EraseBkgrnd没有成功,所以是乱的。如楼上所说,记得把旧的brush恢复回去,否则可能不能释放。
flyingice 2001-07-09
  • 打赏
  • 举报
回复

3:也许和你没有写拷贝构造函数有关系。
其他的看法和他们一样。
xxxbird 2001-07-09
  • 打赏
  • 举报
回复

4. 你有没有在Rotate函数中使用了未分配空间的指针?
6. 你调用Rectangle的参数不对。


huangbeyond 2001-07-08
  • 打赏
  • 举报
回复
.
xiaoy 2001-07-08
  • 打赏
  • 举报
回复
谢谢xxxbird,第一个问题已经行了,果然是按C编绎的,把它改为.CPP就没事了。
第四个问题,我做的是让一个点绕原点旋转一定角度,是这样调用的:
(在WM_PAINT中)
pt.x=Rotate(hdc,nFrom,nAngle);
函数调用应该是没错的。
zzh 2001-07-07
  • 打赏
  • 举报
回复
内存的问题一般是因为你申请了资源,而没有释放掉,一般是你的刷子或其它一些句柄等对象,检查一下在OnPaint函数中是否有这些问题
ahphone 2001-07-07
  • 打赏
  • 举报
回复
在case WM_ERASEBKGND这一段提个建议,最好弄一个hOldBlkBrush保存原来的参数,这绝对是应该的
xxxbird 2001-07-07
  • 打赏
  • 举报
回复

4. 这就有可能不是你这段程序的问题。看看它是怎么被调用的 ? 将调用此函数的之前的一段代码贴出来一些。
xxxbird 2001-07-07
  • 打赏
  • 举报
回复

Rectangle(hdc,rcClient.left, rcClient.top, rcClient.right, rcClient.bottom);
xiaoy 2001-07-07
  • 打赏
  • 举报
回复
4、一样的,只要执行一两步,就变了。我真是快疯了。
5、我先试试,谢谢!
ahphone 2001-07-07
  • 打赏
  • 举报
回复
4、你把这些先remark掉看看。
5、http://www.vckbase.com/study/ 深入VC编程内幕这本书里有检查内存泄露的办法。

Q:我听说MFC可以发现内存漏洞,我怎样使用该特性?
A:如 果 你 在 Debug 菜 单 中 的 Go 选 项 ( 不 是 Project 菜 单 中 的 Execute 选 项 ) 来 运 行 你 的 应 用 程 序,MFC 应 该 在 程 序 终 止 时 报 告 内 存 漏 洞。如 果 没 有,那 么 试 试 运 行 MFC Tracer 工 具 程 序 ( 在 VC++ 程 序 组 中 ),并 启 动 跟 踪。然 后 返 回 应 用 程 序。


xiaoy 2001-07-07
  • 打赏
  • 举报
回复
4、给那个二维数组赋值完后,hdc、nFrom 和nAngle就已经为零了。
5、如下:
case WM_ERASEBKGND:
RECT rcClient;
HBRUSH hBlkBrush;
hBlkBrush=CreateSolidBrush(RGB(100,100,255));
GetClientRect(hWnd,&rcClient);

hdc=(HDC)wParam;
//hdc=GetDC(hWnd);
SelectObject(hdc,hBlkBrush);
Rectangle(hdc,rcClient.left,rcClient.right,
rcClient.top,rcClient.bottom);
return TRUE;
xxxbird 2001-07-07
  • 打赏
  • 举报
回复

TO ahphone(阿丰):
char * p = new char[8]; 的写法没有问题。

4. 将你的函数从开始到出现问题的部分都贴出来。

5. 有时候看起来都释放了,但实际上...

6. 你在WM_ERASEBKGND中是如何处理的?光返回TRUE是不行的,你必须要全部重画背景。



xiaoy 2001-07-07
  • 打赏
  • 举报
回复
4、在这个函数的开始,我只是给一个二维数组赋值,不关这几个参数的事。如下:
POINT pt[4][2];

pt[0][0].x=;
pt[0][0].y=;
pt[1][0].x=;
pt[1][0].y=;
pt[2][0].x=;
pt[2][0].y=;
......
5、我也是这样做的啊。
6、我就是处理了WM_ERASEBKGRND,所以才这样的。我也是返回TRUE的。

ahphone 2001-07-07
  • 打赏
  • 举报
回复
1、我new 的是:
char *p=new char[8];
我记得好象应该这样写:
char *p;
p=new char[8];
xxxbird 2001-07-07
  • 打赏
  • 举报
回复

1.另一种可能, new, delete 只能在C++中使用,不能在C程序中使用。C与C++要区分开。如果你的文件扩展名为.C, 一般情况下它都是按C语法编译的。可以将其扩展名改为.CPP. 或编译时用 /TP 选项。

2. 参考1.

3. 同ahphone(阿丰).

4. 也有可能你在这几步无意中改变了它们的值。将这几步的代码贴出来 ?

5. 分配的内存或其它GDI对象要释放。

6. >> 窗口在启动时,它把原来screen上的内容弄到它的client里做背景了
你在窗口登记时没有指定hbrBackground, 这样你需要在WM_ERASEBKGND中重画背景,并返回TRUE.


xiaoy 2001-07-07
  • 打赏
  • 举报
回复
谢谢!
1、我new 的是:
char *p=new char[8];
2、我两次是一样的使用CStr,
4、用引用也是一样的结果,我用过了。
5、我也是这样做的,我把所有new的、带H的,都delete或DeleteObject()也。还是不行。
ahphone 2001-07-07
  • 打赏
  • 举报
回复
1、不能用new、delete?可能因为你动态创建的对象不支持动态创建,如果不是,那么问题在其他地方
2、是不是头文件包含,或者这个类有什么地方还不够好。一般如果其他程序不调用这个类时,就算有错误,也不会被反映出来。
3、
for(int i=0;i<nLen;i++){
sTemp._p[i]=_p[i];
}sTemp._p[i]='\0';  

最好把int i放到外面,for结束的时候,i的生命已经结束了。
sTemp._p[i]='\0'i此时理论上是个随即数
4、考虑用引用
5、这方面讨论德比较多,你可以在CSDN上搜索一把
一个好习惯是写一个new,顺手写一个delete
6、偶再想想

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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