以前一直做基于API的应用开发,最近用MFC Dialog做了几个项目,在此记录一下过程,以备后用。
1、关于异常处理
微软提供了一个异常捕捉结构,
__try
{
//TODO:
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
__finally()
{
}
此异常处理结构能够处理C++异常之外的系统异常,比如IO、内存操作等等。此异常结构中不能创建对象实例,否则编译不通过,但是可以把创建对象实例的代码放在一个函数中,然后对该函数使用此结构是可以的。C++异常用try{}catch(){}结构捕捉。
需要注意的是finally中的部分是一定会执行的,比如在try中使用return语句返回,但是还是会执行finally中的语句。
2、关于函数返回值问题
函数返回值分为两种,一种是值类型,一种是指针类型,传递值类型时是将函数内部产生的值拷贝给调用者,传递指针类型时只是将函数内部内存地址拷贝给调用者,但是该地址指向的内存在函数返回后是否有效,则分两种情况。情况一,该指针指向的内存属于函数局部内存,则在函数返回后该内存无效,很可能立即被分配给别的变量使用,这样一来在调用函数中访问返回的指针指向的内容,获取的内容很可能不正确;情况二,该指针指向的内存属于函数外部,比如说类的成员变量、全局变量等,此时在调用函数中访问返回的指针指向的内容时,根据内存的作用范围又有所不同,举例如下:
返回值的函数,int func(){ int a= 0; return a;}此时返回的a即使是局部变量,也能正确将其代表的值返回给调用者。
返回指针的函数, LPTSTR func(){ TCHAR szStr[100] = {0}; return szStr}此种情况下,返回的只是指向szStr的地址,但是函数返回后,该地址中的内容已经不可用,调用这时候用时很可能发生意想不到的错误,导致运行时错误,但是如果szStr放在函数外面,并且对调用者和该函数都有效的话, 则不存在这问题。
3、new出来的内存必须初始化,否则的话里面会存在很多乱码。
4、成员变量应该被初始化,尤其是指针类型的,更需要初始化。