知识点1:用VS开发软件,其中release版本和debug版本的区别
概念:
Debug指调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,为开发人员提供强大的应用程序调试能力。
Release指发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试,所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利。
debug程序通常比release程序最慢,尤其是处理视频方面release要比debug快很多。
debug跟release在初始化变量时所做的操作不同,debug是将每个字节位都赋城0xcc,而release的赋值近似于随机。
只有debug版本才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句,release版本不包含任何调试信息,所以体积小,运行快。
具体可参考http://www.cnblogs.com/JemBai/archive/2009/01/13/1374805.html
总结:
知识点2:VC定时器的用法SetTimer和Ontimer
概念:
1 )用WM_TIMER来设置定时器
先请看SetTimer这个API函数的原型
UINT_PTR SetTimer(
HWND hWnd,//和定时器相关联的窗口(窗口句柄)
UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
UINT uElapse,//指定时间间隔,以毫秒为单位
TIMERPROC lpTimerFunc//一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(
UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
UINT uElapse,//指定时间间隔,以毫秒为单位
TIMERPROC lpTimerFunc//一般指定为null
);
用法如下:
SetTimer(m_hWnd,1,1000,NULL);
m_hWnd:句柄(在MFC中,SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了)
1:计时器的名称;
1000:时间间隔,单位是毫秒;
NULL:使用onTime函数。
返回值:
如果函数成功,hWnd参数为0,则返回新建立的时钟编号,可以把这个时钟编号传递给KillTimer来销毁时钟.
如果函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟.
如果函数失败,返回值是零.若想获得更多的错误信息,调用GetLastError函数.
在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 此处加入如下代码就好了:
switch()
{
case 1:
//做该做的事情
//当不需要的时候在此处调用KillTimer(1);
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
当不需要计时器的时候调用KillTimer(nIDEvent);
例如:KillTimer(1);
具体可参考 点击打开链接总结:
知识点3:部分头文件介绍
#include "stdafx.h"//预编译头文件——把一个工程中使用的一些MFC标准头文件(如Windows.H、Afxwin.h)预先编译,编译结果会保存,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果,这样可以加快编译速度,节省时间。注:由于预编译的头文件后缀时“PCH”,所以编译结果文件是projectname,pch
#include <crtdbg.h>//内存泄漏与检测的头文件
#include <fstream>//文件流头文件——包含对文件操作的一般函数
知识点4:Bool和bool区别
概念:
1、类型不同
2、长度不同
3、取值不同
总结
知识点5:MFC的UpdateData()函数
UpdateData() 是MFC的窗口函数,用来刷新数据的。
总的来说:操作系统会调用这个函数来初始化对话框中的数据,或者检索或者验证对话框中的数据。
简单说就是:
1、UpdateData(TRUE) == 将控件的值赋值给成员变量,即从窗口编辑框中读入数据;
2、UpdateData(FALSE) == 将成员变量的值赋值给控件,将数据从窗口显示。
知识点6:C++中delete和delete[]的区别
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>;
using
namespace
std;
class
T {
public
:
T() { cout <<
"constructor"
<< endl; }
~T() { cout <<
"destructor"
<< endl; }
};
int
main()
{
const
int
NUM = 3;
T* p1 =
new
T;
cout << hex << p1 << endl;
// delete[] p1;//非数组
delete
p1;
T* p2 =
new
T[NUM];
cout << p2 << endl;
delete
[] p2;
}
|
结果:
从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用 。