MFC编写程序的时候遇到的一些逻辑错误 持续......

本文列举了MFC编程时遇到的8个典型逻辑错误,包括野指针删除、线程同步问题、死循环、文件句柄管理、双缓冲理解错误等,并详细分析了错误原因和解决方案,提醒开发者注意指针管理和线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:

                 if(pData != NULL) delete[] pData;
                
这句话   pData是一个全局变量,  结果加上这句话就出错   。 原因:  pData没有初始化  造成其成为一个野指针, delete释放的时候释放错误的位置 造成出现错误弹窗!


2:  传输一些数据 直接传输没有问题        但是建立一个新线程进行传输    结果不能正常传输   !

原因:   建立新线程进行传输的时候 还没传输完毕的时候      主线程就已经关闭了传递给子线程的套接字!  所以失败!


3  打开屏幕接受窗口就卡死:

原因: 因为我没有使用多线程去接受传送过来的屏幕消息,  在接受的时候使用了while(1)   这就导致了死循环  。  即使使用sleep()也没有用 照样会卡死  

把接收过程写成一个单独的线程  解决了问题     

记住  只要使用while(1)  就要把这句话放到一个线程中去!!!



4    接收完毕图像数据后 将其保存为bmp图像存在e盘下面,  然后读取在MFC窗口显示 ,然而连续的接收被控端传递过来的数据,在显示了10几帧之后关闭显示窗口会出现断言错误!

原因:我把创建打开文件的句柄定义成局部变量,在某个循环中接收数据并写入bmp文件时,当关闭窗口时CloseHandle(hfile);来不及执行造成了断言错误! 解决方法:定义成全局变量,并在窗口关闭的时候检验是否关闭了文件句柄!   以及在新打开bmp图像时判断上次的是否关闭   关闭后再打开.


5  关于双缓冲的理解 我以前理解有错误  造成屏幕依旧闪烁  推荐给自己几个网站看下

http://blog.youkuaiyun.com/mzwang123/article/details/5054730

http://blog.sina.com.cn/s/blog_5be1061c0100cr1o.html

http://www.cnblogs.com/watsonlong/archive/2011/04/19/2021486.html

http://blog.163.com/yuanlong_zheng@126/blog/static/49846449201033093333394/


6   在窗口最上面放了几个按钮,准备在按钮下面显示图像 结果造成按钮周围出现屏幕图像   而且不是收到的屏幕的图像  刷新什么的 窗口覆盖都会残留图像在上面

纠结了一晚上   修改了所有能影响到图像大小的地方  修改了窗口 以及所有的MoveWindow(rect)   都没有用 

后来反应过来 应该是因为我在窗口擦除函数里取消了函数的擦除 ,造成按钮周围的那片区域产生了空白色   不会被收到的图像填充    遇到窗口遮蔽就会把别的窗口印上去  故使用了下面重新进行填充解决了问题

 
	::GetClientRect(this->m_hWnd,&rect);
	rect.bottom = 20;
	COLORREF color=RGB(174,221,129);
	pDC->FillSolidRect(rect,color);//使用某种颜色填充客户区上头一拇指粗的长方形区域,不然如果有按钮控件的话,按钮控件周边会被填充屏幕的图像	


7  关闭显示屏幕的子窗口就出错!   出现弹窗

一开始无任何头绪,胡乱找原因,乱改,反而改出了其它错误,搞的恶心头疼,后来调试时发现在接收屏幕图像的线程中用到了一个全局变量 BYTE*pData.  它指向的空间在子窗口构造函数中分配   在oncancle中销毁   ,  在关闭窗口后,调试窗口跳到了使用pData的一个地方, 发现pData这时候是个野指针。不知道为什么 ,又是一顿狂改。后来猛然发现是因为MFC窗口关闭时,窗口主线程关闭了 但是建立的子线程却没有关闭 所以这个线程还是会运行一会的 而运行的时候需要pData  pData所指向的空间已经在窗口销毁的时候释放掉了  所以就出现了错误弹窗    解决方法:判断pData是否为NULL  如果是则退出此线程   

感悟:  如果释放了某个空间后 ,一定要将这个指针设置为NULL  而不是不管它    设置为NULL后就可以更加容易的找到错误了!


8  error LNK2001: 无法解析的外部符号 "public: static char * ConnectInfo::ipAddress" (?ipAddress@ConnectInfo@@2PADA)

原因:  好久没有使用c++了  忘记了c++中的静态变量(大部分)是需要在外部进行初始化的  否则会出现这种信息!  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值