152 lines
12 KiB
HTML
152 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::terminate</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_error_terminate skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>terminate</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-error.html">error</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-exception.html"><exception></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody class="t-dcl-rev">
|
|
<tr class="t-dcl t-until-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> terminate<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-until-cxx11">(C++11 前)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="br0">[</span><span class="br0">[</span>noreturn<span class="br0">]</span><span class="br0">]</span> <span class="kw4">void</span> terminate<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>C++ 运行时在程序因任何下列原因不能继续时调用 <code>std::terminate()</code> :</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 未捕捉<a href="cpp-language-throw.html">抛出的异常</a>(此情况下是否进行任何栈回溯是实现定义的)</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 在处理仍未经由异常捕捉的异常时(例如由某局部对象的析构函数,或构造 catch 子句参数的复制构造函数抛出),由异常处理机制所直接调用</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 静态或<span class="t-rev-inl t-since-cxx11"><span>线程局域</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span>对象的构造函数或析构函数抛出异常</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 以 <span class="t-lc"><a href="cpp-utility-program-atexit.html">std::atexit</a></span> <span class="t-rev-inl t-since-cxx11"><span>或 <span class="t-lc"><a href="cpp-utility-program-at_quick_exit.html">std::at_quick_exit</a></span></span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span>注册的函数抛出异常</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx17">
|
|
<td>
|
|
<div class="t-li1"><span class="t-li">5)</span> 违反<a href="cpp-language-except_spec.html">动态异常说明</a>,并执行了 <span class="t-lc"><a href="cpp-error-unexpected.html">std::unexpected</a></span> 的默认处理函数</div>
|
|
<div class="t-li1"><span class="t-li">6)</span> <span class="t-lc"><a href="cpp-error-unexpected.html">std::unexpected</a></span> 的非默认处理函数抛出了违背先前所违背动态异常规定的异常,若这种规定不包含 <span class="t-lc"><a href="cpp-error-bad_exception.html">std::bad_exception</a></span></div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx17">(C++17 前)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<div class="t-li1"><span class="t-li">7)</span> 违反 <a href="cpp-language-noexcept_spec.html">noexcept 说明</a>(此情况下是否进行任何栈回溯是实现定义的)</div>
|
|
<div class="t-li1"><span class="t-li">8)</span> 为一个不保有被捕获异常的对象调用 <span class="t-lc"><a href="cpp-error-nested_exception-rethrow_nested.html">std::nested_exception::rethrow_nested</a></span></div>
|
|
<div class="t-li1"><span class="t-li">9)</span> 从 <span class="t-lc"><a href="cpp-thread-thread.html">std::thread</a></span> 的起始函数抛出异常</div>
|
|
<div class="t-li1"><span class="t-li">10)</span> 可结合的 <span class="t-lc"><a href="cpp-thread-thread.html">std::thread</a></span> 被析构或赋值</div>
|
|
<div class="t-li1"><span class="t-li">11)</span> <span class="t-lc"><a href="cpp-thread-condition_variable-wait.html">std::condition_variable::wait</a></span>、 <span class="t-lc"><a href="cpp-thread-condition_variable-wait_until.html">std::condition_variable::wait_until</a></span> 或 <span class="t-lc"><a href="cpp-thread-condition_variable-wait_for.html">std::condition_variable::wait_for</a></span> 无法达成其前条件(例如若重锁定互斥抛出)</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<div class="t-li1"><span class="t-li">12)</span> <a href="cpp-algorithm.html">并行算法</a>所调用的函数经由未捕捉异常退出,且该<a href="cpp-algorithm-execution_policy_tag_t.html">执行策略</a>指定了终止。</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>亦可直接从程序调用 <code>std::terminate()</code> 。</p>
|
|
<p><br />
|
|
任何情况下, <code>std::terminate</code> 调用当前安装的 <span class="t-lc"><a href="cpp-error-terminate_handler.html">std::terminate_handler</a></span> 。默认的 <span class="t-lc"><a href="cpp-error-terminate_handler.html">std::terminate_handler</a></span> 调用 <span class="t-lc"><a href="cpp-utility-program-abort.html">std::abort</a></span> 。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx11">
|
|
<td>
|
|
<p>若析构函数在栈回溯时重设 terminate_handler ,且后面的回溯导致调用 <code>terminate</code> ,则在 throw 表达式的结尾安装的处理函数会得到调用。(注意:重抛出是否应用新处理函数是有歧义的)</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx11">(C++11 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>若析构函数在栈回溯时重设 terminate_handler ,则若后面的栈回溯导致调用 <code>terminate</code> ,调用哪个处理函数是未指定的。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<p>(无)</p>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>(无)</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>若不想要处理函数机制,例如因为它要求可能增加二进制大小的原子操作,则在非正常终止程序时直接调用 <span class="t-lc"><a href="cpp-utility-program-abort.html">std::abort</a></span> 更适合。</p>
|
|
<p>某些编译器内建子程序,例如 <a rel="nofollow" class="external text" href="https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html"><code>__builtin_trap</code></a> ( gcc、 clang 及 icc )或 <a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/cpp/intrinsics/debugbreak?view=msvc-160"><code>__debugbreak</code></a> ( msvc ),能用于尽可能快地终止程序。</p>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2111">LWG 2111</a></td>
|
|
<td>C++11</td>
|
|
<td>在栈回溯期间调用 <code>set_terminate</code> 的效果异于 C++98 并破坏一些 ABI</td>
|
|
<td>令它未指定</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-error-terminate_handler.html"><span class="t-lines"><span>terminate_handler</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-lc"><strong class="selflink">std::terminate</strong></span> 所调用的函数类型<br />
|
|
<span class="t-mark">(typedef)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-program-abort.html"><span class="t-lines"><span>abort</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>导致非正常的程序终止(不进行清理)<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|