C++旧源码向新标准移植陷井(一)_局部栈变量的生命周期

之前在VC++6.0上面写了下面这样的代码:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
   //不重要的部分略过if (argc>1)
        {if (strcmp(argv[1],"createpcsstep") == 0)
                {
                    CDlgCreateStepPcs dlg;
                    dlg.DoModal();
                    break;
                }
                else if (strcmp(argv[1],"clearunless") == 0)
                {
                    CDlgClearUnless dlg;
                    dlg.DoModal();
                    break;
                }
          //还有很多这样的弹对话框,都省略了吧,只留两个else {}
        }
    }
    return nRetCode;
}

很明显这是一个控制台程序,启动根据条件判断弹出一个对话框,这段代码在VC6.0中编译,运行无任何问题;

后来照这个代码流程移植成VS2008 + QT sdk重新编译,发现对话框是一闪而过,想了好久,硬是不知道问题出在哪里,可把我郁闷的够呛,经过多次的把代码移动试验,突然想到是变量的生命周期问题,想到这点就豁然开朗了,VS2008使用了新的C++标准,在新标准中C++规定{}中的变量只在这个块中有效,出了块就被析构了(类是被析构),因此Qt中正确的代码顺序是这样的:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDialog *pDlg = NULL;  //新的C++标准中,不能在if块中声明对像,否则出了块就被析构了
    if (argc > 1)
    {
        if (strcmp(argv[1],_SCRIPTS_NAME_OUTPUTGERBER) == 0)
        {
            pDlg = new DlgOutputGerber;
             pDlg->show(); //造成问题的关键在这里,不同于MFC,这里执行完了还要继续向下进入到a.exec()消息循环
        }
    }
    int nRet = a.exec();
    if (pDlg != NULL) delete pDlg;
    return nRet;
}

见上面的所述的关键点,如果是像前面那样在if块里面声明一个Dialog对像,show()完之后就要出块进入a.exec(),但这样一旦出块,Dialog对像就已经被析构了,因些窗口一闪而过.

我在这里采用的方法是,块外面定义一个指针,if块里面在堆上实例化一个Dialog对像,完美解决此问题.

C++旧源码向新标准移植陷井(一)_局部栈变量的生命周期

时间: 2024-10-06 09:31:14

C++旧源码向新标准移植陷井(一)_局部栈变量的生命周期的相关文章

2016年新版 六合彩投注网站系统源码 带新开奖结果

2016年新版 恒信六合彩系统 带新开奖结果>>>>>玩法齐全>连码自由对碰>各类玩法内附说明.数据库文件  hs001   修改数据库连接  文件夹 configs  文件config后台管理 admin admin前台会员目录 member <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op> <ig

CBTC系OA开心乐园源码出售统标准: 1474.1---系统性能及功能需求

CBTC系统标准:OA开心乐园源码出售论坛:haozbbs.com Q1446595067 1474.1---系统性能及功能需求: 系统总体需求: 1). 系统特点: ? 独立于轨道电路的列车精确定位: ? 车地之间双向.连续.大容量的通信: ? 车载(VOBC)和柜旁(ZC.CI)执行关键功能. 2). 系统分类: ? 仅有ATP: ? 既有ATP,也有ATO和ATS. 3). 运营模式: ? CBTC内的正常运行:(CBTC车和非CBTC车): ? CBTC内的故障运行:(降低速度.加大追踪

幸运28源码下载与Uboot 移植步骤

Uboot 移植步骤: Vi Makefile 注意修改交叉编译工具链Vi boards.cfg 查看uboot 已支持的板子, 幸运28源码下载QQ:2152876294 网址diguaym.com 哪款板子跟我们要移植的板子更接近如果origen 板子跟 我们的板子接近, 参考origen 板子移植我们的uboot拷贝origne 板子的所有文件到fs4412 ,Cp -rf board/samsung/origen board/samsung/fs4412 Mv board/samsung

新标准C++程序设计读书笔记_运算符重载

形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 1 class Complex 2 { 3 public: 4 double real,imag; 5 Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i) { } 6 Complex operator-(const Complex & c); 7 }; 8 9 Complex

新标准C++程序设计读书笔记_继承和多态

简单继承的例子: 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class CStudent 6 { 7 private: 8 string name; 9 string id; //学号 10 char gender; //性别,'F'代表女, 'M'代表男 11 int age; 12 public: 13 void PrintInfo(); 14 void SetInfo( const

新标准C++程序设计读书笔记_类和对象

面向对象的程序设计方法 抽象:将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性):将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构. 封装:通过某种语法形式,将数据结构和操作该数据结构的函数“捆绑”在一起,形成一个“ 类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系. 从客观事物抽象出类 写一个程序,输入矩形的长和宽,输出面积和周长. 比如对于“矩形”这种东西,要用一个类来表示,该如何做“抽象”呢?矩形的属

【转载】Android IntentService使用全面介绍及源码解析

一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何work?*/ 1.IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. 2.Clients send requests through

Android IntentService使用全面介绍及源码解析

一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何work?*/ 1.IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. 2.Clients send requests through

Flume-ng源码解析之Channel组件

如果还没看过Flume-ng源码解析之启动流程,可以点击Flume-ng源码解析之启动流程 查看 1 接口介绍 组件的分析顺序是按照上一篇中启动顺序来分析的,首先是Channel,然后是Sink,最后是Source,在开始看组件源码之前我们先来看一下两个重要的接口,一个是LifecycleAware ,另一个是NamedComponent 1.1 LifecycleAware @[email protected] interface LifecycleAware {  public void s