как прервать программу С++ и выйти со статусом 0?

Я хочу убить свою программу на С++ и немедленно завершить ее, не активируя деструкторы любого рода, особенно статические и глобальные переменные, но я хочу выйти со статусом 0 - abort() для меня не работает.

у кого-нибудь есть решение? Спасибо


person WeaselFox    schedule 10.01.2012    source источник
comment
Почему abort() у вас не работает, если можно спросить?   -  person Mike Nakis    schedule 10.01.2012
comment
Почему вы не хотите активировать деструкторы?   -  person John Dibling    schedule 10.01.2012
comment
`Эта функция генерирует сигнал SIGABRT, который по умолчанию приводит к завершению программы, возвращая в хост-среду код ошибки неудачного завершения.   -  person WeaselFox    schedule 10.01.2012
comment
Если ничего не очищается, то зачем вам выходить с кодом 0?   -  person Joe    schedule 10.01.2012
comment
@Joe: Большая часть вещей убирается. По ОС. Вы не знаете, что делает его приложение. Есть причина, по которой _exit системный вызов существует :)   -  person    schedule 10.01.2012
comment
это программа, которая работает в среде скриптов Python, это длинная история   -  person WeaselFox    schedule 10.01.2012
comment
@VladLazarenko Я хорошо знаком с exit(0), но он выполняет правильную очистку, чего не хочет ОП. abort завершает программу без вызова каких-либо деструкторов и завершает работу с неудачным кодом завершения, как и должно быть.   -  person Joe    schedule 10.01.2012
comment
Этот вопрос, вероятно, стоит вашего времени, если вы его еще не читали.   -  person Samuel Harmer    schedule 10.01.2012
comment
В качестве промежуточного варианта используется std::quick_exit.   -  person Kerrek SB    schedule 10.01.2012


Ответы (3)


Может быть, _exit(0); это то, что вы ищете?

Вот справочная страница для чтения об этом.

person Grammin    schedule 10.01.2012
comment
это активирует деструкторы, не так ли? - person WeaselFox; 10.01.2012
comment
В C++11 это стандартизовано как std::_Exit (унаследовано от C99) или std::quick_exit. - person Mike Seymour; 10.01.2012

Из С++ 11 n3290 - § 18.5:

[[noreturn]] void _Exit(int status) noexcept;

Программа завершается без выполнения деструкторов для объектов автоматической, потоковой или статической продолжительности хранения и без вызова функций, переданных в atexit().

На самом деле это определено в C99, поэтому на практике работает с большим количеством реализаций до C++11.

Использовать:

#include <cstdlib>
#include <iostream>

struct test {
  ~test() {
    std::cout << "Goodbye world" << std::endl;
  }
};

int main() {
  test t;
  _Exit(0);
}
person Flexo    schedule 10.01.2012
comment
Я думаю, было бы полезнее, если бы вы уточнили, в каких версиях C++ это будет работать, а в каких нет. - person Samuel Harmer; 10.01.2012
comment
@ Styne666: n3290 означает С++ 11. Но эта функция является частью C99. И, скорее всего, сработает даже раньше. - person kennytm; 10.01.2012

Как насчет _Exit(0) от stdlib.h. (Демонстрация: http://ideone.com/ecCgC)

person kennytm    schedule 10.01.2012
comment
Это по-прежнему будет вызывать деструкторы глобальных и статических объектов. - person bitmask; 10.01.2012
comment
@bitmask: Нет, это не так. См. N3290 §18.5/3. - person kennytm; 10.01.2012
comment
@bitmask: не в С++ 11 этого не будет. В C++03 это не указано, но, вероятно, и не будет. - person Mike Seymour; 10.01.2012
comment
@MikeSeymour, KennyTM: извините, этот комментарий должен был быть в предложении exit(0). Либо это ошибка в SO-движке, либо я нажал не на ту ссылку. - person bitmask; 10.01.2012