Dalam C dan C ++, apa perbedaan antara exit()dan abort()? Saya mencoba untuk mengakhiri program saya setelah kesalahan (tidak terkecuali).
Dalam C dan C ++, apa perbedaan antara exit()dan abort()? Saya mencoba untuk mengakhiri program saya setelah kesalahan (tidak terkecuali).
Jawaban:
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 adan bbenar, 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:
SomeClassType someobject;
void myProgramIsTerminating1(void)
{
cout<<"exit function 1"<<endl;
}
void myProgramIsTerminating2(void)
{
cout<<"exit function 2"<<endl;
}
int main(int argc, char**argv)
{
atexit (myProgramIsTerminating1);
atexit (myProgramIsTerminating2);
//abort();
return 0;
}
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:
fungsi keluar 2
fungsi keluar 1
Hal-hal berikut terjadi ketika suatu program memanggil exit():
atexitfungsi dieksekusitmpfiledihapusFungsi abort() mengirimkan SIGABRTsinyal ke proses saat ini, jika tidak tertangkap program dihentikan tanpa jaminan bahwa stream terbuka memerah / tertutup atau bahwa file sementara yang dibuat melalui tmpfiledihapus, atexitfungsi terdaftar tidak dipanggil, dan non- status keluar nol dikembalikan ke host.
Dari halaman manual exit ():
Fungsi exit () menyebabkan terminasi proses normal dan nilai status & 0377 dikembalikan ke induk.
Dari halaman manual abort ():
Batalkan () pertama-tama membuka blokir sinyal SIGABRT, dan kemudian menaikkan sinyal itu untuk proses panggilan. Ini menghasilkan penghentian proses yang abnormal kecuali jika sinyal SIGABRT ditangkap dan penangan sinyal tidak kembali.
abortmengirimkan SIGABRTsinyal. aborttidak kembali ke penelepon. Penangan default untuk SIGABRTsinyal menutup aplikasi. stdioaliran file memerah, lalu ditutup. Destructors untuk instance kelas C ++ tidak, (tidak yakin yang ini - mungkin hasilnya tidak terdefinisi?).
exitmemiliki callback sendiri, diatur dengan atexit. Jika panggilan balik ditentukan (atau hanya satu), mereka dipanggil dalam urutan terbalik dari pesanan pendaftaran mereka (seperti tumpukan), kemudian program keluar. Seperti abort, exittidak kembali ke penelepon. stdioaliran file memerah, lalu ditutup. Juga, destruktor untuk instance kelas C ++ dipanggil.