Dalam C dan C ++, apa perbedaan antara exit()
dan abort()
? Saya mencoba untuk mengakhiri program saya setelah kesalahan (tidak terkecuali).
abort()
keluar dari program Anda tanpa memanggil fungsi yang didaftarkan menggunakan atexit()
terlebih dahulu, dan tanpa memanggil destruktor objek terlebih dahulu. exit()
melakukan keduanya sebelum keluar dari program Anda. Itu tidak memanggil destruktor untuk objek otomatis. Begitu
A a;
void test() {
static A b;
A c;
exit(0);
}
Akan merusak a
dan b
benar, tetapi tidak akan memanggil destruktor dari c
. abort()
tidak akan memanggil destruktor dari kedua objek. Karena ini sangat disayangkan, Standar C ++ menjelaskan mekanisme alternatif yang memastikan penghentian dengan benar:
Objek dengan durasi penyimpanan otomatis semuanya dihancurkan dalam program yang fungsinya
main()
tidak berisi objek otomatis dan mengeksekusi panggilan keexit()
. Kontrol dapat ditransfer langsung ke seperti itumain()
dengan melemparkan pengecualian yang tertangkapmain()
.
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
Alih-alih menelepon exit()
, alih-alih mengatur kode itu throw exit_exception(exit_code);
.
batalkan mengirim sinyal SIGABRT, keluar hanya menutup aplikasi melakukan pembersihan normal.
Anda dapat menangani sinyal batal sesuka Anda, tetapi perilaku default adalah menutup aplikasi juga dengan kode kesalahan.
batalkan tidak akan melakukan penghancuran objek dari anggota statis dan global Anda, tetapi keluar akan.
Tentu saja meskipun ketika aplikasi ini benar-benar ditutup, sistem operasi akan membebaskan setiap memori yang tidak masuk dan sumber daya lainnya.
Dalam membatalkan dan keluar dari penghentian program (dengan asumsi Anda tidak mengabaikan perilaku default), kode kembali akan dikembalikan ke proses induk yang memulai aplikasi Anda.
Lihat contoh berikut:
Komentar:
Jika batalkan uncommented: tidak ada yang dicetak dan destruktor dari beberapa objek tidak akan dipanggil.
Jika batalkan dikomentari seperti di atas: someobject destructor akan dipanggil Anda akan mendapatkan output berikut:
sumber
Hal-hal berikut terjadi ketika suatu program memanggil
exit
():atexit
fungsi dieksekusitmpfile
dihapusFungsi
abort
() mengirimkanSIGABRT
sinyal ke proses saat ini, jika tidak tertangkap program dihentikan tanpa jaminan bahwa stream terbuka memerah / tertutup atau bahwa file sementara yang dibuat melaluitmpfile
dihapus,atexit
fungsi terdaftar tidak dipanggil, dan non- status keluar nol dikembalikan ke host.sumber
Dari halaman manual exit ():
Dari halaman manual abort ():
sumber
abort
mengirimkanSIGABRT
sinyal.abort
tidak kembali ke penelepon. Penangan default untukSIGABRT
sinyal menutup aplikasi.stdio
aliran file memerah, lalu ditutup. Destructors untuk instance kelas C ++ tidak, (tidak yakin yang ini - mungkin hasilnya tidak terdefinisi?).exit
memiliki callback sendiri, diatur denganatexit
. Jika panggilan balik ditentukan (atau hanya satu), mereka dipanggil dalam urutan terbalik dari pesanan pendaftaran mereka (seperti tumpukan), kemudian program keluar. Sepertiabort
,exit
tidak kembali ke penelepon.stdio
aliran file memerah, lalu ditutup. Juga, destruktor untuk instance kelas C ++ dipanggil.sumber