仿佛是忽然间产生的问题,每次程序退出时候,必然崩溃,花了整整一天才找到原因,就是对数据库的IO读写错误。主要是因为析构函数调用了Disconnect函数,内容如下:

void SFTPTool::Disconnect()
{
    if (!m_valided)
        IsCompteValide();
    if (!m_valided) {
        return;
    }
    QString strModule = "soft";
    if (!m_taskname.isEmpty()) strModule = m_taskname;
    m_sftp->Disconnect();
    // super exp 使用登录框时,没有初始化m_lite实例,此时插入日志,程序必然崩溃!
    if (SystemGlobal::m_lite) // hang exp 这样可以解决登录框的问题,但无法解决正常退出的问题(估计是全局远程连接造成的问题)
        SystemGlobal::m_lite->InsertLog("task", strModule, "disconnect", tr("disconnect by soft"));
}

崩溃的原因有两种情况:

1. 使用登录框的时候,因为System::m_lite在主界面MainWidget的构造函数中实例化,所以必然失败。这个问题通过加上if (SystemGlobal::m_lite)可以解决。

2. 软件主界面退出时,仍然出错,还是因为红色的句子。我想可能是因为有个g_sftp实例晚于主界面被析构(因为是静态实例),此时主界面都没有了,因此数据库实例也被析构了,然后在内存中把全局实例析构,就发生了错误。

综合以前的经验,教训总结:碰到IO错误,程序必然崩溃。碰到内存错误,有时候崩溃有时候不崩溃,有可能会产生误用数据而不一定崩溃。除非读写OS保护区域的内存,才会必然崩溃。使用野指针都不一定崩溃。

MainWidget::~MainWidget()
{
    SystemGlobal::m_lite->InsertLog("app", "soft", "exit");
    // exp 使用全局锁居然会出错 fixme 各对象的析构顺序是怎样的?
    if (SystemGlobal::m_lite) {
        delete SystemGlobal::m_lite; // OO 删除内存对象,不是删除日志数据库文件。这样万无一失,可随时停止日志
        SystemGlobal::m_lite = NULL; // Archi 即使在主界面中析构,也仍然要把指针赋予空值,因为全局内存对象析构比主界面还晚,因此仍会出错
    }
    if (SystemGlobal::m_index) {
        delete SystemGlobal::m_index;
        SystemGlobal::m_index = NULL;
    }
}

经试验,在主界面中把指针赋予空值也可解决问题。

综合经验:IO读写错误必然导致程序崩溃的更多相关文章

  1. WPF 线程中异常导致程序崩溃

    一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnh ...

  2. 头疼3-4次的问题,数据从DB导出到EXCEL,再从EXCEL导入到DB,数据格式发生错误 ,导致 程序出错。

    反思: 1 解决 问题的思路 绕远了: 在这个问题出现前,程序是运行正确 的 问题出现前,我误删了DB 的 testcase表的所有 case ,然后 再把邮件 中的excel数据导入到 DB 然后 ...

  3. 防止Form中嵌入WebBrowser出错导致程序崩溃

     siow(1253366)  10:11:13两种方法你用的自带的webbrowser还是embeded那个毛小毛(3335076)  10:12:15或者有什么办法拦截到是webbrowser,如 ...

  4. 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

    在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChang ...

  5. setSupportActionBar(toolbar)导致程序崩溃闪退

    最近在做一个项目,使用了第三方的开源项目,主要是想实现android5.0之后推出的MaterialDesign的风格,但是代码已经写好了,发现一运行就闪退,所以就开始debug,发现问题出现在 To ...

  6. c# Linq Where 抛出异常 导致 程序崩溃

    Collection was modified; enumeration operation may not execute" 这次项目中遇到一个问题, 就是C#程序随机崩溃, 抛出上面的异 ...

  7. Visual Studio 调试系列8 查找导致程序崩溃的 DLL(使用模块窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 如果应用程序在调用系统 DLL 或他人的代码时崩溃,则需要找出在崩溃发生时处于活动状态的 DLL. 如果在自己的程序之外的 DLL 中遇到崩溃, ...

  8. Android While 循环导致的资源占用过高进而导致程序崩溃问题

    Timeline: Activity_launch_request time:6562004-14 15:31:25.347: I/dalvikvm(3483): Total arena pages ...

  9. 安装glibc错误链接导致系统崩溃,u盘启动紧急救援模式下修复系统。

    Sln 命令  创建动态符号链接 用法 sln source  dest 故障案例:一个误操作 导致了一个不小的故障,输入所有命令都无效,直接系统无法启动. 故障描述 sln /usr/lib64/l ...

随机推荐

  1. Linux系统各发行版镜像下载(2)

    Fedora ISO镜像下载: Fedora 是一个开放的.创新的.前瞻性的操作系统和平台,基于 Linux.它允许任何人自由地使用.修改和重发布,无论现在还是将来.它由一个强大的社群开发,这个社群的 ...

  2. 使用netbeans 搭建 JSF+SPRING 框架

    spring版本使用4,jsf版本2.2 jsf的配置文件faces-config.xml <?xml version='1.0' encoding='UTF-8'?> <faces ...

  3. ExtJs store加载

    当store加载数据对象中,如果带有success:false,store会认为加载数据失败,不予将得到的数据显示在界面上,所有记得在返回数据对象的同时返回success:true;

  4. .NET 4 新建 webform 项目编译不通过

    .NET 4 新建 webform 项目编译不通过,可能需要做如下改动. 一.根据编译错误,删除 packages.config 中相关包 二.安装包install-package Microsoft ...

  5. Flexbox介绍

    CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式.对于很多应用来讲,弹性盒改进了盒模型,既不使用浮动 ...

  6. Markdown編輯器

    MarkDown编辑器 一.什么是Markdown编辑器 二.怎么使用Markdown编辑器 1.标题/Head 2.超链接/Link/Reference ②自動的郵件連結也很類似,只是Markdow ...

  7. [leetcode] 405. Convert a Number to Hexadecimal

    https://leetcode.com/contest/6/problems/convert-a-number-to-hexadecimal/ 分析:10进制转换成16进制,不能用库函数,刚开始,我 ...

  8. 初识XML及简单工厂运用--网络电视精灵

    网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...

  9. Linux C 程序 字符串运算符-表达式(TWO)

    1.字符串常量 双引号"" :eg:"china"   ,字符串在存储的时候会以一个\0为结束标志.2.符号常量  ,给常量取一个名字. #include< ...

  10. Web前端新人之CSS样式选择器

    最近在学习css样式.那么我就想先整理一下css样式的选择器 规则结构: 每个规则都有两个基本部分:选择器和声明块.声明块由一个或者多个声明组成,每个声明则是一个属性—值对(property-valu ...