VC++项目实例
6.定时器的使用 定时器的使用
(1)单个定时器用法: 单个定时器用法: 单个定时器用法 KillTimer(id); SetTimer(id, time, NULL); OnTimer(id); //备选,根据情况使用。 备选, 备选 根据情况使用。 (2) 有关联的 个定时器用法: 有关联的2个定时器用法 个定时器用法: 当触发了优先级高的定时器时, 当触发了优先级高的定时器时,先关闭低优 先 级的,高优先级执行完毕, 级的,高优先级执行完毕,再开启低优先级的定 时器。 时器。
Hale Waihona Puke 4.多级指针的删除 多级指针的删除
非法访问导致程序崩溃: 非法访问导致程序崩溃: if (m_pLocalInfo->pUserInfo->pBaseInfo != NULL) { Delete m_pLocalInfo->pUserInfo>pBaseInfo; m_pLocalInfo->pUserInfo->pBaseInfo = NULL; }
8.线程的退出 线程的退出
线程退出时要安全释放资源。 线程退出时要安全释放资源。 (1)设计运行完成即退出的线程。 设计运行完成即退出的线程。 设计运行完成即退出的线程 (2)在while循环中检测变量,要求退出时改变变 在 循环中检测变量, 循环中检测变量 量值,使其退出。 量值,使其退出。
9.只在发布包报错的问题 只在发布包报错的问题
VC++ 项目实例
1.指针数组的内存释放 指针数组的内存释放
常用数组CPtrArray、CTypedPtrArray等, 、 常用数组 等 (1) RemoveAt()函数。 RemoveAt()函数 函数。 (2) RemoveAll()函数。 函数。 函数 只从数组中删除对象指针,并不删除对象本身。 只从数组中删除对象指针,并不删除对象本身。
7.含相同结构体的多个类 含相同结构体的多个类
常见问题:容易在销毁时产生野指针。 常见问题:容易在销毁时产生野指针。 解决方法:各自拥有自己创建的结构体的对象, 解决方法:各自拥有自己创建的结构体的对象, 在销毁时自己释放空间。 在销毁时自己释放空间。 注意:在使用过程中,同步信息。 注意:在使用过程中,同步信息。
3.多级指针的访问 多级指针的访问
错误访问方法导致程序崩溃: 错误访问方法导致程序崩溃: if (m_pUserInfo->pConferenceInfo->nConfID != NULL) { WriteConfig(m_pUserInfo>pConferenceInfo->nConfID); } 可以造成非法访问以致程序崩溃,没有判断。 可以造成非法访问以致程序崩溃,没有判断。
定位问题:写日志文件,锁定报错位置。 定位问题:写日志文件,锁定报错位置。 解决方法:改变程序不合理的设计, 解决方法:改变程序不合理的设计,使内存使用 更安全。 更安全。 常见问题:定位不准确。 常见问题:定位不准确。 定出位置后,程序无明显代码漏洞。 定出位置后,程序无明显代码漏洞。
10.窗口类的野指针 窗口类的野指针
与其他类型野指针不同, 与其他类型野指针不同,包括结构体对象的指针 1、if (NULL == ptr) 判断是否为空,都无效 判断是否为空, 、 2、if (IsWindow(ptr->GetSafeHwnd()) 、 只对窗口类指针有效。 只对窗口类指针有效。 作用:在可以运行代码、 作用:在可以运行代码、但逻辑错误的代码中提 高稳定性。 高稳定性。
感谢您的关注! 感谢您的关注!
5.复杂结构体的初始化 复杂结构体的初始化
部分数据成员未初始化导致程序异常: 部分数据成员未初始化导致程序异常: Struct TuserInfo { TCHAR _name[51]; Unsigned __int32 _iSessionID; Byte _iUserStatus; …… } //结构内还包含结构体,总计 个数据成员 结构内还包含结构体, 结构内还包含结构体 总计51个数据成员 对未初始化字符串复制造成后续赋值异常。 对未初始化字符串复制造成后续赋值异常。 swprintf(pt->_name, _T(“%s”), pM->_name);
2.指针数组的元素删除 指针数组的元素删除
删除函数RemoveAt(),RemoveAll() , 删除函数 常见错误删除: 常见错误删除: for(int i=0; i<m_arrInfo.GetCount(); i++) { delete m_arrInfo.GetAt(i); m_arrInfo.RemoveAt(i); } 造成了隔位删除的问题。 造成了隔位删除的问题。 一般解决方法有3种 一般解决方法有 种。