Difference between revisions of "cpp/utility/program/quick exit"
From cppreference.com
m (Update links.) |
Andreas Krug (Talk | contribs) m (fmt, .) |
||
(8 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
− | {{cpp/title| quick_exit}} | + | {{cpp/title|quick_exit}} |
{{cpp/utility/program/navbar}} | {{cpp/utility/program/navbar}} | ||
− | {{ddcl | header=cstdlib | | + | {{ddcl|header=cstdlib|since=c++11| |
− | [[noreturn]] void quick_exit( int exit_code ); | + | [[noreturn]] void quick_exit( int exit_code ) noexcept; |
}} | }} | ||
Causes normal program termination to occur without completely cleaning the resources. | Causes normal program termination to occur without completely cleaning the resources. | ||
− | Functions passed to {{lc|std::at_quick_exit}} are called in reverse order of their registration. If an exception tries to propagate out of any of the functions, {{lc|std::terminate}} is called. After calling the registered functions, calls {{c|std::_Exit(exit_code)}} | + | Functions passed to {{lc|std::at_quick_exit}} are called in reverse order of their registration. If an exception tries to propagate out of any of the functions, {{lc|std::terminate}} is called. After calling the registered functions, calls {{c|std::_Exit(exit_code)}}. |
+ | |||
+ | Functions passed to {{lc|std::atexit}} are not called. | ||
===Parameters=== | ===Parameters=== | ||
{{par begin}} | {{par begin}} | ||
− | {{par | exit_code | exit status of the program}} | + | {{par|exit_code|exit status of the program}} |
{{par end}} | {{par end}} | ||
===Return value=== | ===Return value=== | ||
(none) | (none) | ||
− | |||
− | |||
− | |||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |code= | |
− | + | #include <cstdlib> | |
− | + | #include <iostream> | |
+ | |||
+ | template<int N> | ||
+ | void quick_exit_handler() | ||
+ | { | ||
+ | std::cout << "quick_exit handler #" << N << std::endl; // flush is intended | ||
+ | } | ||
+ | |||
+ | void at_exit_handler() | ||
+ | { | ||
+ | std::cout << "at_exit handler\n"; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | if (std::at_quick_exit(quick_exit_handler<1>) {{!!}} | ||
+ | std::at_quick_exit(quick_exit_handler<2>)) | ||
+ | { | ||
+ | std::cerr << "Registration failed\n"; | ||
+ | return EXIT_FAILURE; | ||
+ | } | ||
+ | |||
+ | std::atexit(at_exit_handler); // the handler will not be called | ||
+ | |||
+ | struct R { ~R() { std::cout << "destructor\n"; } } resource; | ||
+ | |||
+ | /*...*/ | ||
+ | |||
+ | std::quick_exit(EXIT_SUCCESS); | ||
+ | |||
+ | std::cout << "This statement is unreachable...\n"; | ||
+ | } | ||
+ | |output= | ||
+ | quick_exit handler #2 | ||
+ | quick_exit handler #1 | ||
}} | }} | ||
===See also=== | ===See also=== | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/utility/program/dsc abort}} | + | {{dsc inc|cpp/utility/program/dsc abort}} |
− | {{dsc inc | cpp/utility/program/dsc atexit}} | + | {{dsc inc|cpp/utility/program/dsc exit}} |
− | {{dsc inc | cpp/utility/program/dsc at_quick_exit}} | + | {{dsc inc|cpp/utility/program/dsc atexit}} |
− | {{dsc see c | c/program/quick_exit}} | + | {{dsc inc|cpp/utility/program/dsc at_quick_exit}} |
+ | {{dsc see c|c/program/quick_exit}} | ||
{{dsc end}} | {{dsc end}} | ||
− | + | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Latest revision as of 21:47, 25 October 2023
Defined in header <cstdlib>
|
||
[[noreturn]] void quick_exit( int exit_code ) noexcept; |
(since C++11) | |
Causes normal program termination to occur without completely cleaning the resources.
Functions passed to std::at_quick_exit are called in reverse order of their registration. If an exception tries to propagate out of any of the functions, std::terminate is called. After calling the registered functions, calls std::_Exit(exit_code).
Functions passed to std::atexit are not called.
Contents |
[edit] Parameters
exit_code | - | exit status of the program |
[edit] Return value
(none)
[edit] Example
Run this code
#include <cstdlib> #include <iostream> template<int N> void quick_exit_handler() { std::cout << "quick_exit handler #" << N << std::endl; // flush is intended } void at_exit_handler() { std::cout << "at_exit handler\n"; } int main() { if (std::at_quick_exit(quick_exit_handler<1>) || std::at_quick_exit(quick_exit_handler<2>)) { std::cerr << "Registration failed\n"; return EXIT_FAILURE; } std::atexit(at_exit_handler); // the handler will not be called struct R { ~R() { std::cout << "destructor\n"; } } resource; /*...*/ std::quick_exit(EXIT_SUCCESS); std::cout << "This statement is unreachable...\n"; }
Output:
quick_exit handler #2 quick_exit handler #1
[edit] See also
causes abnormal program termination (without cleaning up) (function) | |
causes normal program termination with cleaning up (function) | |
registers a function to be called on std::exit() invocation (function) | |
(C++11) |
registers a function to be called on std::quick_exit invocation (function) |
C documentation for quick_exit
|