IT问题日记1

来源:互联网 发布:运营数据分析 数据挖掘 编辑:程序博客网 时间:2024/06/05 11:47

知识点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

总结:

debug版本适合开发人员使用;release版本适合用户使用。


知识点2:VC定时器的用法SetTimer和Ontimer

概念:

SetTimer是设置一个计时器并开始执行计时器OnTimer中的代码,OnTimer是计时器所执行的代码,KillTimer是用于停止计时器。

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);

具体可参考点击打开链接

总结:

SetTimer是设置,OnTimer是响应SetTimer消息的。

知识点3:部分头文件介绍

#include "stdafx.h"//预编译头文件——把一个工程中使用的一些MFC标准头文件(如Windows.H、Afxwin.h)预先编译,编译结果会保存,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果,这样可以加快编译速度,节省时间。注:由于预编译的头文件后缀时“PCH”,所以编译结果文件是projectname,pch

#include <crtdbg.h>//内存泄漏与检测的头文件

#include <fstream>//文件流头文件——包含对文件操作的一般函数


知识点4:Boolbool区别

概念:

1、类型不同

bool为布尔型,用作逻辑判断
BOOL在<windef.h>typedef int BOOL;
   在<wtype.h>typedef long BOOL;

2、长度不同

bool只有一个字节;
BOOL长度视实际环境来定,一般可认为是4个字节

3、取值不同

bool取值true和false,0为false,非0为true(-1和2都是true)
BOOL是微软定义的typedef  int BOOL(在windef.h中),0为FALSE,1为TRUE(-1和2既不是true也不是false,此时BOOL单纯作为int类型使用)

总结

bool适用范围广,BOOL只适用于windows开发平台上,且作为封装好的关键字调用

知识点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[] 对应使用

可参考http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html

0 0