回顾自己写过最蠢的代码,记录一下,时常警醒自己,另外由于时间的关系只能列举一二,有空再慢慢添加了。
1:if判断语句,=与== 的疏漏
int mCount = 0;
for (int i = 0; i < 10; i++)
{
if (i = 2)
{
QString strFormat;
mCount++;
strFormat=QString("\n curent now i is: %d ,count is :%d").arg(i).arg(mCount);
qDebug() << strFormat;
}
}
qDebug() << "printover";
简单的几句代码,结果导致程序进入了死循环,究其原因便是==与=的疏漏。
2:count++ 用来作延时,也有卡死的时候,尤其在多线程中慎用。
bool bOK = false;
int waitTime = 0;
bool bTimeout = false;
while (DCMM->PCard->IsAxisRunning(index) )//
{
if (waitTime > 60000)
{
bTimeout = true;
break;
}
waitTime++; //waitTime++ 这种计数方式是错误的,极易引起堵塞线程
Sleep(1);
}
正确的写法应该用GetTickCount()之类的函数去写,或者这样:
void delay_us(void)
{
LARGE_INTEGER litmp;
LONGLONG QPart1, QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 获得初始值
do {
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;//获得中止值
dfMinus = (double)(QPart2 - QPart1);
dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
} while (dfTim<0.000001);
}
3:对象指针作引用参数传递,应该用指针的指针**Pointer
举个例子:
已知: CStudent mP1;
要求生成Student的函数:
要想用CStrudent* 做指针传递,函数得这样写:
void GeneratorStudent(CStudent** mpy)
{
*mpy=new CStudent(L"小明");
}
4:未初使化,未分配内存的指针,直接使用就会崩溃的喔
举个例子:
LPVOID mPoint; //表示任意指什变量
mPoint->setValue(20);//未作任何初使化new的过程就直接调用,肯定会崩了
5: 全局只有一个对象,UI界面对象却是用在栈上,在多线程中容易发生冲突
比如小组同事开发了一个新界面,现在要把它作为新对象new起来,嵌入到主界框架中,如果直接在函数内部 CPageWinX* mPWin=new CPageWinX();
用是能用,但在多线程中更新的时候容易产生访问权限冲突之类的问题,正确的做法是将mPwin作为全局变量,或是在头文件声明为成员变量即可。
PS:这种细节比较发现,对异常需要细心又耐心的Debug跟踪才行。