-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
105 lines (98 loc) · 9.7 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>http://example.com</id>
<title>Hexo</title>
<link href="http://example.com" />
<updated>2021-08-21T04:42:31.278Z</updated>
<entry>
<id>http://example.com/2021/08/21/QT%E5%85%B3%E9%97%AD%E7%AA%97%E5%8F%A3%E6%97%B6%E6%98%BE%E7%A4%BA%E7%A8%8B%E5%BA%8F%E5%BC%82%E5%B8%B8%E7%BB%93%E6%9D%9F/</id>
<title></title>
<link rel="alternate" href="http://example.com/2021/08/21/QT%E5%85%B3%E9%97%AD%E7%AA%97%E5%8F%A3%E6%97%B6%E6%98%BE%E7%A4%BA%E7%A8%8B%E5%BA%8F%E5%BC%82%E5%B8%B8%E7%BB%93%E6%9D%9F/"/>
<content type="html"><h1 id="qt关闭窗口时显示程序异常结束解决办法"><a class="markdownIt-Anchor" href="#qt关闭窗口时显示程序异常结束解决办法">#</a> QT 关闭窗口时显示程序 “异常结束” 解决办法</h1>
<h2 id="1问题概述"><a class="markdownIt-Anchor" href="#1问题概述">#</a> 1. 问题概述</h2>
<p>使用 QT 运行程序时,程序正常运行,但在关闭窗口后,程序输出窗口发现程序并没有立即关闭,而是等待一会儿后打印输出 “程序异常结束 “,若下图所示:</p>
<p><img src="C:%5CUsers%5CZWP%5CDesktop%5C%E5%8D%9A%E5%AE%A2%5C%E7%A8%8B%E5%BA%8F%E5%BC%82%E5%B8%B8%E7%BB%93%E6%9D%9F.png" alt="程序异常结束"></p>
<p>有人给出了一种暴力解决方案:修改 main.cpp 函数中的这两行代码</p>
<pre><code class="language-c++">// 原代码
// MainWindow w;
// w.show();
// 修改后
MainWindow* w=new MainWindow;
w-&gt;show();
</code></pre>
<p>emm… 确实可以让它不再报错了,可是如果你在析构函数里放个打印输出函数的话,你会发现你关闭窗口后它并不会给你打印,也就是说你关闭窗口时它并不执行析构函数!一些 new 出来的变量内存并不能很好地释放掉,在 QT 中运行还好,但如果你发布成软件的话在进行关闭软件操作时就会出现问题,可以说这并没有解决真正的问题。下面介绍产生这种报错的原因的解决方法。</p>
<p><mark>注:本文分析的是关闭窗口后报” 程序异常结束 “错误,而不是程序刚开始运行或运行过程中报错,后者产生的原因有很多,建议点击 QT 中的调试 -&gt; 开始调试 -&gt;start debuging for…,运行时会直接给你找出出错的语句</mark></p>
<h2 id="2问题产生原因与解决方法"><a class="markdownIt-Anchor" href="#2问题产生原因与解决方法">#</a> 2. 问题产生原因与解决方法</h2>
<h3 id="1对象被多次析构"><a class="markdownIt-Anchor" href="#1对象被多次析构">#</a> ①对象被多次析构</h3>
<p>存在这种问题时,如果关闭窗口,程序输出窗口会等 2~3s 就会报” 程序异常结束 “,那么大概率是对象被多次析构了,一下情况会导致对象被多次析构:</p>
<pre><code class="language-c++">/* 1.new一个新对象时给它配置了父对象,而在别处或析构函数中delete了它的对象指针
实际上,给某对象配置父对象后,父对象销毁时该对象指针会被自动销毁,无需去主动销毁它
但如果new的是一个子线程,则必须主动销毁它,销毁方式见②*/
//如:
QCPItemRect* selectRect=new QCPItemRect(this);
delete selectRect;
/* 2.试图去delete一个智能指针
智能指针不需要去主动销毁*/
//如:
shared_ptr&lt;InterfaceForPython&gt; p_obj_python=make_shared&lt;InterfaceForPython&gt;();
delete p_obj_python;
/* 3.同一个对象指针被delete了多次*/
//如:
QCPItemRect* selectRect=new QCPItemRect(this);
delete selectRect;
delete selectRect; //最后这次delete一定是在某个析构函数中,不然运行中就会报错
</code></pre>
<p><mark>解决办法:当然是找出在哪里用了不该用的 delete 然后删掉咯</mark></p>
<h3 id="2存在while死循环或耗时任务无法在短时间内运行完毕或多线程对象指针没有主动销毁"><a class="markdownIt-Anchor" href="#2存在while死循环或耗时任务无法在短时间内运行完毕或多线程对象指针没有主动销毁">#</a> ②存在 while 死循环或耗时任务无法在短时间内运行完毕,或多线程对象指针没有主动销毁</h3>
<p>存在这种问题时,如果关闭窗口,程序输出窗口会等待很长时间,然后报” 程序异常结束 “。这个就不用多说了,尤其多线程中可能就需要 while 死循环或存在耗时任务来不断执行某些代码。</p>
<p><mark>解决办法如下:</mark></p>
<pre><code class="language-c++">/*若是存在while死循环或耗时任务无法在短时间内运行完毕,需要在循环任务中添加跳出标志位,在该函数所在对象的父对象的析构函数中修改标志位的值,达到强制跳出循环的目的*/
class Myclass: QObject
&#123;
Myclass(QObject *parent = nullptr);
void noStopRun()&#123;while(runflag)&#123;...&#125; &#125;; //runflag是跳出标志位,noStopRun()函数中while(runflag)&#123;...&#125;是一个死循环或耗时任务
bool runflag=true;
&#125;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
&#123;
myObject.noStopRun(); //myObject为在MainWindow的类声明中定义的成员变量:Myclass myObject;
&#125;
MainWindow::~MainWindow()
&#123;
myObject.runflag=false; //使子函数退出死循环
&#125;
/*若是多线程对象指针没有主动销毁,按此步骤销毁*/
MainWindow::~MainWindow()
&#123;
//若存在while死循环或耗时任务无法在短时间内运行完毕,按上面方式添加标志位,并在此赋false;若不存在则不需要这行代码
//thread_manager-&gt;runflag=false;
thread_manager-&gt;quit(); //thread_manager是一个子线程
thread_manager-&gt;wait(); //必须等待线程结束
thread_manager-&gt;deleteLater();
delete ui;
delete thread_manager;
&#125;
</code></pre>
</content>
<updated>2021-08-21T04:42:31.278Z</updated>
</entry>
<entry>
<id>http://example.com/2021/08/21/hello-world/</id>
<title>Hello World</title>
<link rel="alternate" href="http://example.com/2021/08/21/hello-world/"/>
<content type="html"><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="quick-start"><a class="markdownIt-Anchor" href="#quick-start">#</a> Quick Start</h2>
<h3 id="create-a-new-post"><a class="markdownIt-Anchor" href="#create-a-new-post">#</a> Create a new post</h3>
<figure class="highlight bash"><figcaption data-lang="bash"><span>h</span></figcaption><table><tr><td data-num="1"></td><td><pre>$ hexo new <span class="token string">"My New Post"</span></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="run-server"><a class="markdownIt-Anchor" href="#run-server">#</a> Run server</h3>
<figure class="highlight bash"><figcaption data-lang="bash"><span>h</span></figcaption><table><tr><td data-num="1"></td><td><pre>$ hexo server</pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="generate-static-files"><a class="markdownIt-Anchor" href="#generate-static-files">#</a> Generate static files</h3>
<figure class="highlight bash"><figcaption data-lang="bash"><span>h</span></figcaption><table><tr><td data-num="1"></td><td><pre>$ hexo generate</pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="deploy-to-remote-sites"><a class="markdownIt-Anchor" href="#deploy-to-remote-sites">#</a> Deploy to remote sites</h3>
<figure class="highlight bash"><figcaption data-lang="bash"><span>h</span></figcaption><table><tr><td data-num="1"></td><td><pre>$ hexo deploy</pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>
</content>
<updated>2021-08-21T04:42:31.275Z</updated>
</entry>
</feed>